MySQL "set unique_checks", "set foreign_key_checks" против "alter table disable keys" - PullRequest
5 голосов
/ 20 августа 2009

У нас возникла проблема, когда скрипт mysqldump тратит 90% своего времени на заполнение небольшого количества таблиц, с которыми имеет дело. Устранение FK и индексов устраняет проблему скорости, но не является приемлемым решением.

Скрипт дампа имеет имеет:

/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;

Можем ли мы ожидать какого-либо другого поведения от ALTER TABLE foo DISABLE KEYS?

Кроме того, disable keys ограничена сессией или является постоянной, пока я не включу ее снова? Могу ли я отключить ключи от одного сеанса mysql и повлиять на импорт, полученный из другого сеанса?

Ответы [ 2 ]

5 голосов
/ 20 августа 2009

Да, вы должны получить значительные выгоды от DISABLE KEYS. Он не ограничен сессией, это свойство таблицы, поэтому ваши ключи будут мертвыми для всех, пока вы не выполните ENABLE KEYS.

4 голосов
/ 15 ноября 2012

DISABLE KEYS только для MyISAM:

Если вы используете ALTER TABLE для таблицы MyISAM, все неуникальные индексы создаются в отдельном пакете (как для REPAIR TABLE). Это должно сделать ALTER TABLE намного быстрее, если у вас много индексов.

Эта функция может быть явно активирована для таблицы MyISAM. ALTER TABLE ... DISABLE KEYS говорит MySQL прекратить обновление неуникальных индексов. Затем следует использовать ALTER TABLE ... ENABLE KEYS для повторного создания отсутствующих индексов. MySQL делает это с помощью специального алгоритма, который намного быстрее, чем вставка ключей один за другим, поэтому отключение ключей перед выполнением массовых операций вставки должно значительно ускорить процесс. Использование ALTER TABLE ... DISABLE KEYS требует привилегии INDEX в дополнение к привилегиям, упомянутым ранее.

Хотя неуникальные индексы отключены, они игнорируются для операторов, таких как SELECT и EXPLAIN, которые в противном случае использовали бы их.

из Синтаксис ALTER TABLE

Использование DISABLE KEYS с любым другим механизмом хранения приводит к предупреждению:

mysql> ALTER TABLE `foo` DISABLE KEYS;
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> show warnings \G
*************************** 1. row ***************************
  Level: Note
   Code: 1031
Message: Table storage engine for 'foo' doesn't have this option
1 row in set (0.00 sec)
...