Как отключить индекс в innodb - PullRequest
29 голосов
/ 02 марта 2012

Я пытаюсь ускорить массовую вставку в таблицу 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)

Как мы можем отключить индексы?

Какие есть альтернативы, чтобы избежать использования индекса при массовых вставках?

Как мы можем ускорить процесс?

Ответы [ 4 ]

30 голосов
/ 02 марта 2012

Вы пробовали следующее?

    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

См. Раздел " Советы по массовой загрузке данных "

28 голосов
/ 02 марта 2012

Существует очень веская причина, по которой вы не можете выполнить 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 для линейного перестроения всех неуникальных индексов.

ИМХО эта операция не была закодирована в InnoDB Storage Engine, поскольку все ключи в неуникальном индексеприходят с записью первичного ключа от gen_clust_index (он же Clustered Index).Это было бы очень дорогой операцией, поскольку построение неуникального индекса потребовало бы времени выполнения O (n log n) для извлечения каждого уникального ключа для присоединения к неуникальному ключу.

В свете этого публикацияпредупреждение о попытке DISABLE KEYS/ENABLE KEYS для таблицы InnoDB намного проще, чем кодирование исключений из mysqldump для любых особых случаев, связанных с механизмами хранения не-MyISAM.

8 голосов
/ 09 октября 2014

, чтобы уменьшить затраты на пересчет индексов, вы должны вставить данные либо с помощью DATA INFILE, либо с помощью многострочных вставок Mysql, например

INSERT INTO tbl_name (a, b, c) ЗНАЧЕНИЯ(1,2,3), (4,5,6), (7,8,9);

-> поэтому вставляем несколько строк одним оператором.

Какколичество строк, которые можно вставить одним оператором, зависит от параметра max_allowed_packet mysql.

4 голосов
/ 24 сентября 2018

Немного поздно, но ... что угодно ... забудьте здесь все ответы, не отключайте индексы, нет никакого способа, просто отбросьте их ALTER TABLE tablename DROP INDEX whatever, массово вставьте данные, затем ALTER TABLE tablename ADD INDEX whatever (whatever); время воссоздания индексов составляет 1% от массовой вставки с индексами, например, 400000 строк заняли 10 минут с индексами и 2 секунды без них ..., ура ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...