есть файл, весит 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"
и все бы ничего, но как-то очень медленно. существует ли какое другое решение? спасибо.
Запихнуть файл в mysql базу
Модератор: Bizdelnick
Re: Запихнуть файл в mysql базу
решил проблему тем, что передаю в аргументе количество строк, которое надо пропустить, и после запускаю много скриптов параллельно. может есть еще лучше решение?
-
- Сообщения: 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
Не уверен, конечно, что так быстрее. Померь скорость и сообщи результаты...
Спасибо сказали:
Re: Запихнуть файл в mysql базу
и все бы ничего, но как-то очень медленно. существует ли какое другое решение?
1. Чтобы в БД insert обрабатывался быстрее, надо просто добавлять пакетами, типа:
INSERT INTO tablename (my_pole) VALUES ('str1'), ('str2'), ('str');
По советоам от более опытных товарищей я делаю по 50 штук (не больше, не меньше) и проверяю, чтобы длина строки не превышала 2 гб на паскале (1 гб на php).
2. Из Вашего кода на bash видно, что вы каждый раз логинитесь. Это медленная опреация, имеет смысл сперва сформировать файлы из select, а уже потом выполнить сформированный sql файл с командами.
зы
сообщение Дмитрия увидел после публикации.
Re: Запихнуть файл в mysql базу
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. Согласен. Сейчас испробую.
Re: Запихнуть файл в mysql базу
Дмитрий Н. писал(а): ↑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