www.Litecode.ru – Сборник рецептов для создания сайтов

LOAD DATA INFILE загрузка данных MySQL

ГлавнаяMySQL → LOAD DATA INFILE

LOAD DATA INFILE это встроенный механизм MySQL для загрузки больших объемов данных. Как показывает практика, во всяком случае в perl, такой метод значительно снижает нагрузку на сервер, в частности на оперативную память. Для примера рассмотрим случай, в котором нам требуется загрузить в базу забитый до отказа XLS или ODS файл, в которые как известно входит в аккурат 256 * 256 = 65536 строк. В качестве серверного интерпретатора возьмем perl.

Если делать в «лоб», то с помощью модуля OpenOffice::OODoc считываем файл и складываем в хеш и после пишем из хеша в базу, или на лету читаем файл и пишем сразу. Второй вариант удобен только для плоских структур данных и если нужно дождаться полного считывания файла, такой вариант не подойдет. Следовательно единственный верный способ писать все в хеш, а это значительно раздует память.

Здесь пора упомянуть об альтернативном методе - LOAD DATA INFILE. Этот метод способен загружать данные из текстового файла, с произвольной разметкой полей. Каждый перевод строки эквивалентен разделению строк в таблице.

Синтаксис:

LOAD DATA INFILE '/tmp/data.txt'
INTO TABLE some_table
CHARACTER SET cp1251
FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n';

Что означает загрузить данные из файла /tmp/data.txt, в таблицу some_table, установить windows кодировку, поля каждой строки разделить по запятой, строки разделить по символу перевода строки. Все достаточно прозрачно и понятно.

Весь фокус в том, что писать из текстового файла на порядок быстрее чем из хеша. Обратите внимание, путь к файлу /tmp/data.txt выбран не случайно. Дело в том, что в различных UNIX системах LOAD DATA INFILE по умолчанию работает стабильно лишь с этой директорией, так как у /tmp доступ 777. Лучше при первом запуске использовать этот путь.

Как Вы догадались, разделителем полей может быть любой символ кроме символа перевода строки \n или \r\n или \r. Если нужно употребить символ в контенте, который является разделителем поля, его нужно экранировать через обратный слэш. Например \,.