|
| Дата |
|
USD/RUB | 89.7026 | BTC/USD | 69305.3095 |
|
|
|
Скрипты, программы и технические решения Обсуждаем скрипты, программы и новые технологии. |
27.01.2012, 01:35
|
#1
|
Senior Member
Регистрация: 08.05.2008
Сообщений: 834
Бабло: $258860
|
MySQL импорт большого файла
Всем привет
Нужно импортировать в мускул файл порядка 5гб (более 100 миллионов строк).
1) Пробовал инсертами сначала 1 инсерт - 1 строка. Заняло неделю, и часть инсертов вылетала с ошибками mysql server gone away
2) Пробовал LOAD DATA INFILE, думает сутки, потом убиваю скрипт и добавляется 20-30кк только.
3) Пробовал LOAD DATA INFILE и разбить файл по 100мб, первые 3-4 файла влетают за 10 минут и далее с каждым последующим запросом времени уходит больше и больше. Когда размер таблицы стал более 300мб - то время увеличивается в геометрической прогрессии.
4) Пробовал через mysqlimport - тоже самое что и пункт 2
5) Пробовал LOAD DATA INFILE через временные таблицы - тоже херня, мускул принимает куски по 20мб, весь файл не берёт. Тупо пишет что нет места в темп таблице (The table 'temp_test' is full). Гуглил пол дня - не нашёл какие параметры отвечают за размер временной таблицы, кроме
max_heap_table_size = 300M
tmp_table_size = 300M
300МБ это уже я поставил настройки, и попробовал вогнать файл 100мб, таже самая ошибка "The table 'temp_test' is full".
Временную таблицу делал engine HEAP.
Точнее и так и так:
type=heap
engine=memory
Вобщем вот такие вот проблемы, как это реализовать?
Просто один раз вогнать данные фиг с ними можно подождать неделю. Но данные добавлятся в таблицу будут постоянно, и сколько времени будет это занимать - страшно подумать.
|
|
|
27.01.2012, 01:40
|
#2
|
white powder
Регистрация: 29.04.2007
Сообщений: 2,692
Бабло: $370670
|
|
|
|
27.01.2012, 01:45
|
#3
|
ё
Регистрация: 26.10.2011
Сообщений: 1,520
Бабло: $311895
|
|
|
|
27.01.2012, 01:45
|
#5
|
несъедобный
Регистрация: 06.04.2007
Сообщений: 692
Бабло: $79495
|
попробуй выключить индексы перед началом инсерта и убедись, что key_buffer_size (вроде так пишется, это если майисам движок) достаточного размера
загружать надо через load data infile, это ты в правильном направлении мыслишь
самая жопа при инсерте - это индексы
еще разбивка таблицы по партициям сильно помогает при инсерте, но работать становится неудобно и косяки мерзкие вылезают
__________________
миром правит не тайная ложа, а явная лажа
|
|
|
27.01.2012, 01:46
|
#6
|
white powder
Регистрация: 29.04.2007
Сообщений: 2,692
Бабло: $370670
|
индексы да, надо отключать.
|
|
|
27.01.2012, 01:46
|
#7
|
Senior Member
Регистрация: 08.05.2008
Сообщений: 834
Бабло: $258860
ТС -->
|
ТС
Цитата:
Сообщение от Ower
|
Это немного не то, мне надо своими скриптами вгонять данные
|
|
|
27.01.2012, 01:47
|
#8
|
Senior Member
Регистрация: 08.05.2008
Сообщений: 834
Бабло: $258860
ТС -->
|
ТС
Цитата:
Сообщение от baadf00d
попробуй выключить индексы перед началом инсерта и убедись, что key_buffer_size (вроде так пишется, это если майисам движок) достаточного размера
загружать надо через load data infile, это ты в правильном направлении мыслишь
самая жопа при инсерте - это индексы
еще разбивка таблицы по партициям сильно помогает при инсерте, но работать становится неудобно и косяки мерзкие вылезают
|
key_buffer_size поставить 5гб если файл входной 5гб тоже?
А у меня рам всего 4гб на сервере, это не положит серв?)
|
|
|
27.01.2012, 03:38
|
#9
|
Senior Member
Регистрация: 15.11.2008
Сообщений: 13,239
Бабло: $247847001
|
за 1 инсерт можно сразу множество записей добавлять, кури синтаксис, делай по 1к (можно и больше) записей за инсерт и будет быстро
|
|
|
27.01.2012, 05:06
|
#10
|
автоматизирую интернеты
Регистрация: 05.07.2009
Адрес: chesser.ru
Сообщений: 3,362
Бабло: $470735
|
Цитата:
Сообщение от Dumpty
max_heap_table_size = 300M
tmp_table_size = 300M
300МБ это уже я поставил настройки, и попробовал вогнать файл 100мб, таже самая ошибка "The table 'temp_test' is full".
Временную таблицу делал engine HEAP.
Точнее и так и так:
type=heap
engine=memory
|
engine memory или heap тут не причем
Цитата:
Сообщение от baadf00d
попробуй выключить индексы перед началом инсерта и убедись, что key_buffer_size (вроде так пишется, это если майисам движок) достаточного размера
|
призываешь выключить индексы - это ок, но зачем тогда увеличивать key_buffer_size?
а в целом да, вырубить индексы, использовать bulk insert'ы, если есть какая-то математика, можно prepared statements делать
если нужно поле типа автоинкремента - перед импортом его удаляешь, делаешь импорт, потом вставляешь это поле.
Цитата:
key_buffer_size поставить 5гб если файл входной 5гб тоже?
А у меня рам всего 4гб на сервере, это не положит серв?)
|
хуйней не занимайся
кстати, иногда надо импортить через промежуточные таблицы, обычно это связано как раз с индексами, например, вместо insert нужно делать что-то типа replace или insert...on duplicate update. engine memory пошустрее справится, но тут размер таблицы всегда ограничен и точно фиксирован, поэтому нужно программно организовывать "пачки", если рамы не хватает
|
|
|
|