Как отключить индекс в innodb
Я пытаюсь ускорить массовую вставку в таблицу InnoDB, временно отключив ее индексы:
ALTER TABLE mytable DISABLE KEYS;
Но он дает предупреждение:
+-------+------+-------------------------------------------------------------+
| Level | Code | Message |
+-------+------+-------------------------------------------------------------+
| Note | 1031 | Table storage engine for 'mytable' doesn't have this option |
+-------+------+-------------------------------------------------------------+
1 row in set (0.00 sec)
Как отключить индексы?
Какие существуют альтернативы, чтобы избежать использования индекса при выполнении объемных вставок?
Как ускорить процесс?
Ответы
Ответ 1
Вы пробовали следующее?
SET autocommit=0;
SET unique_checks=0;
SET foreign_key_checks=0;
Из ссылок на MySQL https://dev.mysql.com/doc/refman/5.5/en/optimizing-innodb-bulk-data-loading.html
См. раздел " Советы по загрузке массовой информации"
Ответ 2
Существует очень веская причина, по которой вы не можете выполнить DISABLE KEYS
в таблице InnoDB; InnoDB не предназначен для его использования, а MyISAM.
Фактически, вот что происходит при перезагрузке mysqldump:
Вы увидите таблицу CREATE TABLE
для таблицы MyISAM, следующей за блокировкой записи.
Прежде чем все массовые вставки будут запущены, выполняется вызов ALTER TABLE ... DISABLE KEYS
.
Что это значит, это отключить вторичные индексы в таблице MyISAM.
Затем выполняются объемные вставки. Пока это делается, PRIMARY KEY и все UNIQUE KEYS в таблице MyISAM отключены. Перед UNLOCK TABLEs
выполняется вызов ALTER TABLE ... ENABLE KEYS
, чтобы линейно перестроить все неидеальные индексы.
IMHO эта операция не была закодирована в InnoDB Storage Engine, потому что все ключи в уникальном индексе поставляются с первичной записью ключа из gen_clust_index (также называемой Clustered Index), Это было бы очень дорогостоящей операцией, так как для создания неидеального индекса потребовалось бы время O (n log n) для получения каждого уникального ключа для присоединения к не уникальному ключу.
В свете этого публикация предупреждения о попытке DISABLE KEYS/ENABLE KEYS
в таблице InnoDB намного проще, чем исключения для кодирования mysqldump для любых особых случаев, связанных с механизмами хранения не-MyISAM.
Ответ 3
чтобы уменьшить затраты на повторное вычисление индексов, вы должны вставить данные либо с помощью DATA INFILE, либо с помощью Mysql Multi Row Inserts, например
INSERT INTO tbl_name (a, b, c) ЦЕННОСТИ (1,2,3), (4,5,6), (7,8,9);
- > , вставив несколько строк с одним утверждением.
Сколько строк, которые можно вставить с одним утверждением, зависит от параметра max_allowed_packet mysql.