Подтвердить что ты не робот

Как отключить индекс в 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)

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

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

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

4b9b3361

Ответ 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.