Разбор и вставка 10 миллионов записей в SQL - PullRequest
2 голосов
/ 23 июня 2011

Итак, у меня ~ 10 миллионов записей в файле Excel, которые нужно разобрать определенным образом (я не могу просто конвертировать в CSV и вставить его таким образом) и вставить в разные таблицы базы данных mysql.Я поняла, что всю ночь занимаю всего пару часов.Однако я хотел бы уменьшить это еще больше.У кого-нибудь есть какие-нибудь хитрости или советы, которые могут мне помочь?Я использую Java и JDBC для анализа и подключения.

Ответы [ 5 ]

5 голосов
/ 23 июня 2011

Mysql позволяет загрузить из файла . Возможно, вам следует сделать следующее: прочитать 10000 записей и создать файл. Запустите параллельный запуск load data infile, когда начнете читать следующие 10000 записей.

Так что это должно приблизить вас к быстрому решению:

  1. Распараллелить чтение и загрузить
  2. Вместо отдельных вставок используйте инструменты массовой загрузки данных
3 голосов
/ 23 июня 2011

Изучите использование executeBatch и выполнение блоков по 1000 или около того.Это очень поможет.

2 голосов
/ 24 июня 2011

Идея ...

Создайте промежуточную (временную) базу данных в mysql с таблицей excel_staging, которая соответствует структуре вашего файла Excel - используйте для этой таблицы механизм myisam.

Используйте загрузку данных в файле для загрузки файла Excel (сохраненного в формате csv) в таблицу excel_staging - заполнение не должно занимать более нескольких минут, особенно если это myisam.

truncate table excel_staging;

load data infile 'excel_staging.csv'
into table excel_staging
fields terminated by...
lines terminated by..
(
field1,
field2,
...
);

Записать много выбора в выходной файлоператоры, которые извлекают данные из таблицы excel_staging в отдельные файлы csv, которые вы будете использовать для загрузки в ваши отдельные таблицы производственной базы данных innodb .При необходимости вы можете проявить творческий подход - вам, возможно, даже придется загрузить дополнительные данные для поддержки объединений и т. Д., Чтобы вы могли сгенерировать красиво отформатированный вывод csv.

select distinct cust_id, name into outfile 'customers.csv' 
fields termniated by...
lines terminated by...
from
 excel_staging
order by
 cust_id; -- order for innodb import

select distinct dept_id, name into outfile 'departments.csv' 
fields termniated by...
lines terminated by...
from
 excel_staging
order by
 dept_id;

Загрузить красиво отформатированный, очищенный и упорядоченныйпо CSV-файлам первичного ключа в ваши производственные таблицы innodb, используя данные загрузки данных ...

load data infile 'customers.csv'
into table customers
fields terminated by...
lines terminated by..
(
cust_id,
name
);

...

За исключением времени на кодирование решения (скажем, 30 минут), его можно загружать в стадии подготовки, выводить в CSV изагрузить в рабочие таблицы примерно за мммм ... 6 минут подряд.

Надеюсь, это поможет.

1 голос
/ 23 июня 2011

Несколько советов по производительности JDBC, установите для autoCommit объекта соединения значение false. Но обязательно сделайте коммит после значительного количества вставок (каждые 100К или более). Кроме того, используйте и повторно используйте объект PreparedStatement поверх простого объекта Statement.

1 голос
/ 23 июня 2011

Убедитесь, что во время вставки отключите проверку внешних ключей (влияет только на InnoDB), скорость довольно велика. И затем, конечно, включите внешние ключи, когда закончите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...