Вы правы в том, что выполняете повторяющиеся инструкции INSERT для вставки строк по одному. I.e обработка RBAR (строка из агонизирующей строки) может быть дорогостоящей и мучительно медленной в MySQL.
Предполагая, что вы вставляете строковые значения («слова») в столбец в таблице, и каждое слово будет вставлено в новую строку в таблице ... (и это в целом много допущения там ...)
Например, таблицу, как это:
CREATE TABLE mytable (mycol VARCHAR(50) NOT NULL PRIMARY KEY) ENGINE=InnoDB
Вы правы, что работает отдельный оператор INSERT для каждой строки стоит дорого. MySQL предоставляет расширение синтаксиса оператора INSERT, который позволяет вставлять несколько строк.
Например, эта последовательность:
INSERT IGNORE INTO mytable (mycol) VALUES ('happy');
INSERT IGNORE INTO mytable (mycol) VALUES ('bad');
INSERT IGNORE INTO mytable (mycol) VALUES ('terrible');
Может эмулировать с одним INSERT заявление
INSERT IGNORE INTO mytable (mycol) VALUES ('happy'),('bad'),('terrible');
Каждая «строка» для вставки заключена в круглые скобки, так же, как это в очередной Инструкция INSERT. Трюк - это разделитель запятой между строками.
Проблема с этим возникает, когда есть нарушения ограничений; либо все заявление успешно завершается или не выполняется. В отличие от отдельных вставок, где один из них может выйти из строя, а два других - добиться успеха.
Кроме того, будьте осторожны, чтобы размер (в байтах) инструкции не превышал значение переменной max_allowed_packet
.
В качестве альтернативы, LOAD DATA
утверждения является еще более быстрым способом загрузки строк в таблицу. Но за пару сотен строк это не будет намного быстрее. (Если вы загружались тысячи и тысячи строк, оператор LOAD DATA потенциально может быть намного быстрее
Посмотрите на insert_batch или multi_query() функции . Также:. Http: // StackOverflow.com/questions/779986/insert-multiple-rows-via-a-php-array-in-mysql – Sami