Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Многострочный INSERT vs INSERT в цикле
 
 автор: pojar   (04.11.2011 в 23:54)   письмо автору
 
 

Всегда интересовал вопрос: что менее затратно при вставке большого количества строк в таблицу (допустим 100)
- делать в цикле 100 раз INSERT
- делать один длинючий многострочный INSERT
Какой из вариантов лучше выбирать и по каким соображениям? Спасибо.

  Ответить  
 
 автор: cheops   (05.11.2011 в 00:01)   письмо автору
 
   для: pojar   (04.11.2011 в 23:54)
 

Лучше, конечно, один многострочный INSERT-запрос, так как данные передаются на сервер одним пакетом и обрабатываются одним запросом (меньше тратится оперативной памяти, меньше обращений к диску, выполняется все на порядок быстрее, что важно при большом объеме таблицы, добавление данных в которую довольно ресурсоемко). Единственное, когда следует прибегать к дроблению такого запроса, когда его размер превышает значение, заданное переменной сервера max_allowed_packet (максимальный размер SQL-запроса). Впрочем значение этой директивы можно изменить в my.ini или при помощи оператора SET.

  Ответить  
 
 автор: pojar   (05.11.2011 в 01:45)   письмо автору
 
   для: cheops   (05.11.2011 в 00:01)
 

Спасибо большое за толковый ответ!
Кстати, посмотрел, у меня по-умолчанию max_allowed_packet = 16M. Это ж какой длинный нужно накатать запрос, чтобы он затянул на 16М, если Библия+Война и мир < 16M!
Видимо я что-то не правильно понял. Может имеется в виду не сам текст запроса, а результат выполнения?

  Ответить  
 
 автор: Красная_шляпа   (05.11.2011 в 04:19)   письмо автору
 
   для: pojar   (05.11.2011 в 01:45)
 

в войне и мире три миллиона символов это от трех до шести мегабайт в зависимости от кодировки в библии меньше. сам запрос.

  Ответить  
 
 автор: cheops   (05.11.2011 в 12:26)   письмо автору
 
   для: pojar   (05.11.2011 в 01:45)
 

Многие дампы используют многострочные запросы, пользователи активных форумов за несколько месяцев перекрывают эти 16М на раз, до сотен иногда приходится увеличивать, чтобы дамп развернуть.

  Ответить  
 
 автор: pojar   (05.11.2011 в 12:56)   письмо автору
 
   для: cheops   (05.11.2011 в 12:26)
 

Вот про дампы я как-то сразу и не подумал. Для интереса создал (через PmA) дамп базы, и посмотрел что внутри. Так там отнюдь не один длинючий INSERT на все 40Мб, а очень много отдельных INSERT-ов, в которых по 14-18 строк в зависимости от объема. Почему же сделано так? Почему не сунуло всё в один INSERT? По какой формуле рассчитывал, исходя из каких соображений?
Получается, что 16Мб - это ограничение не на длину одного отдельного запроса, на длину всех подрядидущих запросов.
Поэтому снова стал актуальным тот самый главный вопрос: как рассчитать оптимальное кол-во строк на один INSERT при вставке большого кол-ва строк в таблицу?

  Ответить  
 
 автор: cheops   (05.11.2011 в 14:13)   письмо автору
 
   для: pojar   (05.11.2011 в 12:56)
 

phpMyAdmin штука не стандартная и не надежная, особенно в области создания больших дампов. Кроме того у phpMyAdmin свои настройки, настройки MySQL касаются этого приложения косвенно (как любого MySQL-клиента). Как правило, для создания дампов используется консольная утилита mysqldump или обертки к ней - эта утилита работает в десятки раз быстрее, чем phpMyAdmin. По умолчанию она создает многострочный INSERT-запрос, хотя и её можно заставить создавать отдельные INSERT-запросы. Зачастую так и следует поступать, так как max_allowed_packet = 16Мб встречается не часто, зачастую это 1 или 2Мб (а на арендуемом сервере возможности увеличить это значение, как правило, нет).

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования