Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / вставить 4500 записей / 25 сообщений из 27, страница 1 из 2
23.03.2016, 09:57
    #39198528
buyboy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вставить 4500 записей
всем привет
предстоит вставить в InnoDB-таблицу 4500 записей из 3-х гигового xml-файла
как лучше это сделать?
1. сформировать несколько sql-дампов по 500 записей и затем их импортировать
2. сделать один большой дамп и вставить все разом
3. вставлять в таблицу непосредственно в цикле
...
Рейтинг: 0 / 0
23.03.2016, 10:04
    #39198535
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вставить 4500 записей
Это что ж за записи - чуть не по метру штука?

buyboyкак лучше это сделать?
LOAD XML LOCAL INFILE

Однако с учётом некоторых возможных неблагоприятных эффектов (см. Импорт БД ФИАС в MySQL. Практический опыт. , решение проблемы импорта 16-Гб файла) не исключено, что придётся рубить исходник на куски.

Формировать SQL-дампы - не вижу смысла. Или у XML структура не-плоская, и впрямую не импортируется?
...
Рейтинг: 0 / 0
23.03.2016, 10:08
    #39198543
buyboy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вставить 4500 записей
AkinaЭто что ж за записи - чуть не по метру штука?
это база данных книжного магазина

AkinaИли у XML структура не-плоская, и впрямую не импортируется?
xml-файл - капец какой атасный = атрибутов на узле по 8 штук и дочерних нод штук 20 на 4-5 уровнях вложенности

AkinaФормировать SQL-дампы - не вижу смысла
почему? они же будут проще, чем рубленый на куски родительский xml
...
Рейтинг: 0 / 0
23.03.2016, 10:09
    #39198544
buyboy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вставить 4500 записей
Akina,
причем необходимо данные разнести по нескольким таблицам из одного xml-а
...
Рейтинг: 0 / 0
23.03.2016, 10:21
    #39198554
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вставить 4500 записей
buyboy,
insert- ом, одним или 4500.

4500 записей -это мало.
...
Рейтинг: 0 / 0
23.03.2016, 10:25
    #39198556
buyboy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вставить 4500 записей
MasterZivinsert- ом, одним или 4500.
не совсем понял...
можно вставлять прямо в таблицу в перебирая xml цикле?
...
Рейтинг: 0 / 0
23.03.2016, 10:58
    #39198581
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вставить 4500 записей
buyboyxml-файл - капец какой атасный = атрибутов на узле по 8 штук и дочерних нод штук 20 на 4-5 уровнях вложенности
buyboyпричем необходимо данные разнести по нескольким таблицам из одного xml-а
В таком случае LOAD XML неприменим. И напрямую ни фигашеньки не получится его импортировать, придётся перетряхивать.

Если там нет никаких заворотов вроде оцифрованных изображений обложки, и операция одноразовая - я бы предложил некоей (вероятно, самописной) программой пережевать этот XML тупо как текст на несколько CSV - по файлу на таблицу, одновременно добавив при необходимости дополнительные связующие поля. И потом уже загружать данные через LOAD DATA INFILE.

Альтернативный вариант - достучаться до этого XML через, скажем, System.XML либо там MSXML2, и перелить его данные в таблицы поштучно. В качестве интерфейса можно использовать, например, MS Access, подключив к нему нужные таблицы через MySQL Connector.
...
Рейтинг: 0 / 0
23.03.2016, 11:14
    #39198611
buyboy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вставить 4500 записей
Akina...придётся перетряхивать....
так и сделал = написал на php скриптик, который перебрал xml и сфомировал один дамп из 4644 строк
потом импортнул его в базу из консоли
php-скрипт работал 30 секунд
mysql в терминале - 1 секунду
первая часть задачи решена
p.s. сейчас ради интереса попробую вставлять напрямую в базу - прямо в цикле
...
Рейтинг: 0 / 0
23.03.2016, 11:27
    #39198622
vkle
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вставить 4500 записей
buyboyMasterZivinsert- ом, одним или 4500.
не совсем понял...
можно вставлять прямо в таблицу в перебирая xml цикле?Да как больше нравится. Хотите - по одной строчке вставляйте в цикле обработки входного файла, хотите - в цикле обработки подготовьте запросы на вставку групп записей, а потом по одному запросу на таблицу... Принципиальной разницы нет, лишь бы целостность данных была обеспечена.

Возможно, возникнет другая проблема. Возможно, запись из второй таблицы будет ссылаться на id записи в первой таблице. Если эти id заранее неизвестны (отсутствуют в исходном файле), тогда, скорее всего, придётся получать id вновь создаваемых записей первой таблицы для дальнейшего использования. В таком разе проще делать вставку в первую таблицу по одной записи.

Во что можно впереться? В ограничение max_allowed_packet - а это обычно довольно большая цифра, порядка сотни мегабайт.
...
Рейтинг: 0 / 0
23.03.2016, 11:38
    #39198641
buyboy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вставить 4500 записей
Akina, вставил напрямую из цикла за те же 30 секунд...
вот только почему-то получилось на одну запись меньше :-(
...
Рейтинг: 0 / 0
23.03.2016, 11:46
    #39198645
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вставить 4500 записей
vkleВ ограничение max_allowed_packet - а это обычно довольно большая цифра, порядка сотни мегабайт.По умолчанию всего 1 МБайт до версии 5.6.5 включительно. И 4 Мбайт после.
...
Рейтинг: 0 / 0
23.03.2016, 11:49
    #39198649
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вставить 4500 записей
buyboyпочему-то получилось на одну запись меньше
Сравнить две версии таблиц и найти пропавшую запись - как бы не проблема, верно? будет попроще понять, почему пропала (или нарисовалась лишняя - тоже бывает, хотя обычно "пропадает" последняя физически запись) запись.
Вот только я не очень понимаю - ты произвёл при этом раскладку в несколько таблиц или нет? и если да, то какая таблица "урезана".
...
Рейтинг: 0 / 0
23.03.2016, 11:52
    #39198653
buyboy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вставить 4500 записей
Akinaты произвёл при этом раскладку в несколько таблиц или нет?
пока еще нет - тока обмозговываю...
так как во вторую таблицу предстоит вставить 111 тысяч книг = http://www.sql.ru/forum/1206525/vstavit-111-500-zapisey
...
Рейтинг: 0 / 0
23.03.2016, 11:59
    #39198665
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вставить 4500 записей
Да хоть миллион... только следи, чтобы диск не забился.
...
Рейтинг: 0 / 0
23.03.2016, 12:00
    #39198667
buyboy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вставить 4500 записей
AkinaДа хоть миллион...
спасибо, это обнадеживает
...
Рейтинг: 0 / 0
23.03.2016, 12:40
    #39198710
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вставить 4500 записей
Единственный совет - если будешь выполнять загрузку через LOAD DATA|XML, то создавай индексы после загрузки данных. Это как правило получается быстрее, чем загрузка и индексирование одновременно.
...
Рейтинг: 0 / 0
23.03.2016, 13:14
    #39198746
buyboy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вставить 4500 записей
Akinaсоздавай индексы после загрузки данных. Это как правило получается быстрее, чем загрузка и индексирование одновременно.
не понял тебя...
разве индексы создаются не в момент создания таблицы?
или я туплю?
...
Рейтинг: 0 / 0
23.03.2016, 13:37
    #39198764
Alex_Ustinov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вставить 4500 записей
ну когда вы добавляете записи в индексированную таблицу, то одновременно со вставкой записи добавляются соответствующая информация в индексные файлы, т.е. возникают дополнительные расходы при вставке.
Т.е. вставка в не индексированную таблицу пройдет гораздо быстрее и проще.....
...
Рейтинг: 0 / 0
23.03.2016, 13:45
    #39198773
buyboy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вставить 4500 записей
Alex_Ustinovвставка в не индексированную таблицу пройдет гораздо быстрее и проще.....
ммм... спасибо за разжевывание...
на 111 тысячах это, наверняка, будет актуально!
...
Рейтинг: 0 / 0
23.03.2016, 13:47
    #39198777
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вставить 4500 записей
buyboyна 111 тысячах это, наверняка, будет актуально!
Особенно это актуально при потоковой (LOAD) вставке.
Да, триггеры, само собой, тоже быстродействия при вставке не добавляют, посему лучше вставлять заведомо целостные данные, а потом только формировать триггеры.
...
Рейтинг: 0 / 0
23.03.2016, 13:48
    #39198778
Alex_Ustinov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вставить 4500 записей
это еще актуальней, если в таблице много индексов и есть форейжны, при этом будут проверяться все констрейнты
...
Рейтинг: 0 / 0
23.03.2016, 13:56
    #39198790
buyboy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вставить 4500 записей
Akina, Alex_Ustinov
спасибище!
...
Рейтинг: 0 / 0
23.03.2016, 14:33
    #39198815
buyboy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вставить 4500 записей
на импорте sql-дампа в 35 мегабайт получил
Код: sql
1.
ERROR 2006 (HY000) at line 1: MySQL server has gone away


это видать проблема с max_allowed_packet?
...
Рейтинг: 0 / 0
23.03.2016, 15:25
    #39198851
Alex_Ustinov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вставить 4500 записей
сервер лег. смотри логи, может там что то подробнее
...
Рейтинг: 0 / 0
23.03.2016, 15:46
    #39198873
buyboy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вставить 4500 записей
Alex_Ustinovсервер лег. смотри логи, может там что то подробнее
у меня max_allowed_packet = 1М... :-))
выставил в max_allowed_packet = 64М и рестартанул mysqld
...
Рейтинг: 0 / 0
Форумы / MySQL [игнор отключен] [закрыт для гостей] / вставить 4500 записей / 25 сообщений из 27, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]