|
|
|
| Всегда интересовал вопрос: что менее затратно при вставке большого количества строк в таблицу (допустим 100)
- делать в цикле 100 раз INSERT
- делать один длинючий многострочный INSERT
Какой из вариантов лучше выбирать и по каким соображениям? Спасибо. | |
|
|
|
|
|
|
|
для: pojar
(04.11.2011 в 23:54)
| | Лучше, конечно, один многострочный INSERT-запрос, так как данные передаются на сервер одним пакетом и обрабатываются одним запросом (меньше тратится оперативной памяти, меньше обращений к диску, выполняется все на порядок быстрее, что важно при большом объеме таблицы, добавление данных в которую довольно ресурсоемко). Единственное, когда следует прибегать к дроблению такого запроса, когда его размер превышает значение, заданное переменной сервера max_allowed_packet (максимальный размер SQL-запроса). Впрочем значение этой директивы можно изменить в my.ini или при помощи оператора SET. | |
|
|
|
|
|
|
|
для: cheops
(05.11.2011 в 00:01)
| | Спасибо большое за толковый ответ!
Кстати, посмотрел, у меня по-умолчанию max_allowed_packet = 16M. Это ж какой длинный нужно накатать запрос, чтобы он затянул на 16М, если Библия+Война и мир < 16M!
Видимо я что-то не правильно понял. Может имеется в виду не сам текст запроса, а результат выполнения? | |
|
|
|
|
|
|
|
для: pojar
(05.11.2011 в 01:45)
| | в войне и мире три миллиона символов это от трех до шести мегабайт в зависимости от кодировки в библии меньше. сам запрос. | |
|
|
|
|
|
|
|
для: pojar
(05.11.2011 в 01:45)
| | Многие дампы используют многострочные запросы, пользователи активных форумов за несколько месяцев перекрывают эти 16М на раз, до сотен иногда приходится увеличивать, чтобы дамп развернуть. | |
|
|
|
|
|
|
|
для: cheops
(05.11.2011 в 12:26)
| | Вот про дампы я как-то сразу и не подумал. Для интереса создал (через PmA) дамп базы, и посмотрел что внутри. Так там отнюдь не один длинючий INSERT на все 40Мб, а очень много отдельных INSERT-ов, в которых по 14-18 строк в зависимости от объема. Почему же сделано так? Почему не сунуло всё в один INSERT? По какой формуле рассчитывал, исходя из каких соображений?
Получается, что 16Мб - это ограничение не на длину одного отдельного запроса, на длину всех подрядидущих запросов.
Поэтому снова стал актуальным тот самый главный вопрос: как рассчитать оптимальное кол-во строк на один INSERT при вставке большого кол-ва строк в таблицу? | |
|
|
|
|
|
|
|
для: pojar
(05.11.2011 в 12:56)
| | phpMyAdmin штука не стандартная и не надежная, особенно в области создания больших дампов. Кроме того у phpMyAdmin свои настройки, настройки MySQL касаются этого приложения косвенно (как любого MySQL-клиента). Как правило, для создания дампов используется консольная утилита mysqldump или обертки к ней - эта утилита работает в десятки раз быстрее, чем phpMyAdmin. По умолчанию она создает многострочный INSERT-запрос, хотя и её можно заставить создавать отдельные INSERT-запросы. Зачастую так и следует поступать, так как max_allowed_packet = 16Мб встречается не часто, зачастую это 1 или 2Мб (а на арендуемом сервере возможности увеличить это значение, как правило, нет). | |
|
|
|