mysql отбрасывает внешний ключ без копирования таблицы - PullRequest
5 голосов
/ 03 сентября 2011

У меня есть таблица InnoDB claims, в которой около 240 миллионов строк. Таблица имеет ограничение внешнего ключа: CONSTRAINT FK78744BD7307102A9 FOREIGN KEY (ID) REFERENCES claim_details (ID). Я хочу удалить таблицу claim_details как можно быстрее.

Основываясь на некоторых экспериментах, кажется, что если я использую SET foreign_key_checks = 0; drop claim_details и затем снова включаю внешние ключи, mysql продолжит применять ограничение, даже если таблица больше не существует. Итак, я считаю, что я должен снять ограничение со стола.

Я пытался использовать ALTER TABLE claims DROP FOREIGN KEY FK78744BD7307102A9 для удаления ограничения, и запрос находился в состоянии «копировать в таблицу tmp» более 24 часов (на машине без другой загрузки). Я не понимаю, почему удаление ограничения требует создания копии таблицы. Есть ли способ предотвратить это?

mysql версия 5.1.48.

Ответы [ 2 ]

6 голосов
/ 28 июня 2013

Начиная с MySQL 5.6, MySQL поддерживает удаление внешних ключей на месте / без копирования.Oracle называет это Online DDL .

В этой таблице перечислены все Online DDL операции и их поведение во время выполнения.

Из моегоопыт, отбрасывая внешние ключи и соответствующие ограничения на 600 ГБ таблицы почти мгновенно.С 5.5 это, вероятно, заняло бы дни.

Единственный недостаток, который мне известен, это то, что 5.6 не позволяет вам восстанавливать табличное пространство.Т.е., если вы используете innodb_file_per_table, этот файл не будет уменьшаться при удалении индексов.Только неиспользуемые данные в файле будут расти.Вы можете легко проверить, используя SHOW TABLE STATUS и столбец Data_free.

2 голосов
/ 03 сентября 2011

Я думаю, что нет хорошего способа отбросить этот внешний ключ

http://dev.mysql.com/doc/refman/5.5/en/innodb-create-index-limitations.html

"MySQL 5.5 не поддерживает эффективное создание или удаление ограничений FOREIGN KEY. Поэтому, если выиспользуйте ALTER TABLE для добавления или удаления ограничения REFERENCES, дочерняя таблица копируется, а не с помощью быстрого создания индекса. "Это, вероятно, относится и к более старым версиям mysql.

Я думаю, что лучшим способом будет сброс данных из claims с помощью mysqldump, воссоздание таблицы без ссылки на внешний ключ на claim_details, отключение проверки ключа с помощьюSET foreign_key_checks = 0;, если у вас есть другие внешние ключи и вы импортируете обратно данные для claims.Просто не забудьте создать отдельные дампы для данных и структуры, чтобы вам не нужно было редактировать этот огромный файл, чтобы удалить внешний ключ из синтаксиса создания таблицы.

...