AFAIK, для тех, кто использует таблицы InnoDB, если вы не хотите, чтобы индексы перестраивались после каждого INSERT
, вы должны использовать транзакции.
Например, для вставки пакета из 1000 строк используйте следующий SQL:
SET autocommit=0;
//Insert the rows one after the other, or using multi values inserts
COMMIT;
При отключении автоматической фиксации транзакция будет запущена с первого INSERT
. Затем строки вставляются одна за другой, и в конце транзакция фиксируется и индексы перестраиваются.
Если во время выполнения одного из INSERT
возникает ошибка, транзакция не откатывается, а об ошибке сообщается клиенту, который может откатиться или продолжить. Поэтому, если вы не хотите, чтобы весь пакет откатывался при сбое одного INSERT
, вы можете записать INSERT
с ошибками, продолжить вставку строк и, наконец, зафиксировать транзакцию в конце.
Однако учтите, что перенос INSERT
в транзакции означает, что вы не сможете видеть вставленные строки, пока транзакция не будет зафиксирована. Можно установить уровень изоляции транзакции для SELECT
равным READ_UNCOMMITTED
, но, как я уже проверял, строки не видны, когда SELECT
происходит очень близко к INSERT
. Смотрите мой пост .