Вставка 20к-30к записей в мускуль из CSV

Тема в разделе "WASM.HEAP", создана пользователем _DEN_, 31 авг 2010.

  1. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Привет.

    Когда я добавляю записи через импорт в PHPMyAdmin на локальном денвере, то у меня добавление идет очень медленно, а винт молотит как сумасшедший. 5к записей добавлялось несколько минут. Добавлять 30к мне просто жалко диск. Есть ли какой-то безболезненный способ это сделать? Видимо на каждый insert он физически переструктурирует базу, или что-то около того.
     
  2. Black_mirror

    Black_mirror Active Member

    Публикаций:
    0
    Регистрация:
    14 окт 2002
    Сообщения:
    1.035
    _DEN_
    А если делать INSERT по частям, сначала в таблицу в памяти, а потом в основную таблицу?
     
  3. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Black_mirror

    Думаю это было бы решение, т.к. insert into aaa select * from bbb отрабатывает моментом. Но... а как создать таблицу в памяти? :-[
     
  4. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    А, ну судя по всему надо указать engine MEMORY :)
     
  5. CyberManiac

    CyberManiac New Member

    Публикаций:
    0
    Регистрация:
    2 сен 2003
    Сообщения:
    2.473
    Адрес:
    Russia
    _DEN_
    Коммит он походу делает. Не удивлюсь, если ещё и с перестроением индекса. Там этот автокоммит как-то отрубается, точное заклинание забыл за давностью лет. Поройся в Яндексе по ключевым словам COMMIT, AUTOCOMMIT и TRANSACTION.

    А вообще в Oracle импорт часто делается запуском неэпического скрипта из кучи строчек INSERT с данными. Мобуть и в MySQL такой подход проканает.
     
  6. iZzz32

    iZzz32 Sergey Sfeli

    Публикаций:
    0
    Регистрация:
    3 сен 2006
    Сообщения:
    355
    _DEN_, если в данных уверен, может, индексы выключить, потом обратно включить после импорта?
     
  7. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Всем спасибо, проблема решена. Все действительно делается через вспомогательную таблицу на движке MEMORY. В нее делаем импорт, и потом в основную делаем insert into my_table select * from temp_my_table; - все делается за пару секунд, и винт не насилуется.

    Единственное - по дефолту ограничение на размер временных таблиц - 16 метров, поэтому надо этот размер увеличить. В my.cnf надо в секцию [mysqld] прописать

    max_heap_table_size = 128M
    tmp_table_size = 128M

    128 - соответственно размер таблицы в метрах.