Являются ли автоматически сгенерированные имена внешнего ключа MySQL детерминированными? - PullRequest
3 голосов
/ 23 сентября 2009

Когда создаются ограничения, им присваиваются имена, которые выглядят примерно так: FK5E6B788655A1514E.

Мне интересно, является ли поколение имен детерминированным или случайным. Я заметил, что две отдельные базы данных, которые я использовал, одинаковые схемы, заканчивались одинаковыми именами FK.

Имеет ли смысл при написании сценария обновления из одной версии схемы в другую использовать эти имена ограничений?

Ответы [ 2 ]

3 голосов
/ 22 марта 2013

Я довольно долго размышлял об этом и наткнулся на ваш пост сегодня после того, как провел некоторые собственные исследования. Надеюсь, то, что я нашел, поможет вам.

С http://dev.mysql.com/doc/refman/5.5/en/innodb-adaptive-hash.html:

InnoDB имеет механизм, который отслеживает поиск по индексу. Если InnoDB замечает что запросы могут выиграть от построения хеш-индекса, это делает так автоматически. Эта функция включена innodb_adaptive_hash_index или отключен --skip-innodb_adaptive_hash_index при запуске сервера.

Причина реализации этой функции объясняется здесь:

Если таблица почти полностью помещается в основную память, хеш-индекс может ускорить до запросов путем включения прямого поиска любого элемента, поворачивая индекс значение в виде указателя.

Подробнее о adaptive_hash_index можно найти здесь: http://dev.mysql.com/doc/refman/5.5/en/glossary.html#glos_adaptive_hash_index

Там они объясняют фактическое создание имени индекса:

Индекс хеша всегда строится на основе существующего вторичного объекта InnoDB. индекс, который организован в виде структуры B-дерева. MySQL может построить хеш-индекс для префикса любой длины ключа, определенного для B-дерево, в зависимости от схемы поиска по индексу. Хэш индекс может быть частичным; весь индекс B-дерева не должен быть кэшируется в пуле буферов.

Наконец, здесь немного больше индексов: http://dev.mysql.com/doc/refman/5.5/en/index-btree-hash.html

После прочтения всего этого, я считаю, что, если ваша схема и механизмы БД одинаковы и имеют одинаковые параметры конфигурации в разных средах, вы должны использовать эти значения в сценарии эволюции / миграции. 1029 *

1 голос
/ 23 сентября 2009

Похоже, что сгенерированные машиной имена совпадают. Но это не гарантированное поведение. Я подозреваю, что если бы в MySQL возникла необходимость изменить метод генерации имен в какой-либо будущей версии, они бы не почувствовали, что таким образом нарушают обратную совместимость.

Знаете ли вы, что вы можете указать имена ограничений самостоятельно, чтобы обойти автоматически сгенерированные имена?

create table foo (
  i int, 
  constraint `i_is_unique` unique key (i)
);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...