Запихнуть файл в mysql базу

Для новичков как вообще в Linux, так и в конкретной теме, к которой относится вопрос.

Модератор: Bizdelnick

Ответить
nukacoal
Сообщения: 5

Запихнуть файл в mysql базу

Сообщение nukacoal »

есть файл, весит 8 гигабайт. также есть скрипт, который каждую строчку этого файла засовывает в бд.

while read -r line
do
output=$(echo $line | awk ' { print $1 }')
mysql -u user -ppassword d_base -e "insert into table(value) values('$output')"
done < "$1"

и все бы ничего, но как-то очень медленно. существует ли какое другое решение? спасибо.
Спасибо сказали:
nukacoal
Сообщения: 5

Re: Запихнуть файл в mysql базу

Сообщение nukacoal »

решил проблему тем, что передаю в аргументе количество строк, которое надо пропустить, и после запускаю много скриптов параллельно. может есть еще лучше решение?
Спасибо сказали:
Дмитрий Н.
Сообщения: 174
ОС: openSUSE Leap 15.0

Re: Запихнуть файл в mysql базу

Сообщение Дмитрий Н. »

Может попробовать сначала преобразовать исходный файл в sql скрипт, а потом запустить импорт?

Код: Выделить всё

while read -r line
do
output=$(echo $line | awk ' { print $1 }')
echo "insert into table(value) values('$output');" >> tmp.sql
done < "$1"
mysql -u user -ppassword d_base < tmp.sql


Не уверен, конечно, что так быстрее. Померь скорость и сообщи результаты... :)
Спасибо сказали:
azsx
Сообщения: 3684
ОС: calculate linux, debian, ubuntu

Re: Запихнуть файл в mysql базу

Сообщение azsx »

и все бы ничего, но как-то очень медленно. существует ли какое другое решение?

1. Чтобы в БД insert обрабатывался быстрее, надо просто добавлять пакетами, типа:
INSERT INTO tablename (my_pole) VALUES ('str1'), ('str2'), ('str');
По советоам от более опытных товарищей я делаю по 50 штук (не больше, не меньше) и проверяю, чтобы длина строки не превышала 2 гб на паскале (1 гб на php).
2. Из Вашего кода на bash видно, что вы каждый раз логинитесь. Это медленная опреация, имеет смысл сперва сформировать файлы из select, а уже потом выполнить сформированный sql файл с командами.
зы
сообщение Дмитрия увидел после публикации.
Спасибо сказали:
nukacoal
Сообщения: 5

Re: Запихнуть файл в mysql базу

Сообщение nukacoal »

azsx писал(а):
09.06.2017 22:00
и все бы ничего, но как-то очень медленно. существует ли какое другое решение?

1. Чтобы в БД insert обрабатывался быстрее, надо просто добавлять пакетами, типа:
INSERT INTO tablename (my_pole) VALUES ('str1'), ('str2'), ('str');
По советоам от более опытных товарищей я делаю по 50 штук (не больше, не меньше) и проверяю, чтобы длина строки не превышала 2 гб на паскале (1 гб на php).
2. Из Вашего кода на bash видно, что вы каждый раз логинитесь. Это медленная опреация, имеет смысл сперва сформировать файлы из select, а уже потом выполнить сформированный sql файл с командами.
зы
сообщение Дмитрия увидел после публикации.


1. Таблица на MyIsam engine, т.е. перед записью на жесткий диск, данные сначала грузятся в вирт память и ожидают своей очереди на вставку. Сама же вставка занимает 0.004с. Не думаю, что вставлять по одной строке намного избыточней, чем сразу 50, но я попробую сейчас измерить это.
2. Согласен. Сейчас испробую.
Спасибо сказали:
Аватара пользователя
nerve
Сообщения: 280
ОС: OpenBSD

Re: Запихнуть файл в mysql базу

Сообщение nerve »

Дмитрий Н. писал(а):
09.06.2017 21:49
Может попробовать сначала преобразовать исходный файл в sql скрипт, а потом запустить импорт?

или можно попробовать так

Код: Выделить всё

while read -r line
do
echo $line | awk ' { print $1 }' >> /var/lib/mysql-files/tmp.sql
done < "$1"

echo "LOAD DATA INFILE '/var/lib/mysql-files/tmp.sql' \
IGNORE INTO TABLE table_name FIELDS TERMINATED BY ',' \
(value);" | mysql d_base
Спасибо сказали:
Ответить