В MySQL информация словаря данных таблиц хранится в файлах .frm
,
расположенных в каталогах баз данных. Но для каждой таблицы InnoDB имеются
также свои записи во внутренних словарях данных InnoDB в табличной
области. Когда MySQL удаляет таблицу или базу данных, необходимо удалить
как файлы .frm
, так и соответствующие записи в словаре данных InnoDB.
Именно поэтому нельзя перемещать таблицы InnoDB между базами данных путем
простого перемещения файлов .frm
. По этой же причине DROP DATABASE
не
работал для таблиц InnoDB в MySQL версий <= 3.23.43.
Для всех таблиц InnoDB есть специальный индекс, в котором хранятся данные
строк - он называется кластеризованным индексом. Если в таблице определить
PRIMARY KEY
, то индекс первичного ключа будет кластеризированным индексом.
Если первичный ключ для таблицы не определен, то InnoDB самостоятельно создаст кластеризированный индекс; строки в этом индексе будут упорядочены по идентификатору строки, который InnoDB назначил строкам этой таблицы. Идентификатор строки представляет собой 6-байтовое поле, значение которого постоянно увеличивается при вставке новых строк. Таким образом, сортировка по идентификатору строки фактически представляет собой сортировку по последовательности вставки.
Доступ к строке через кластеризированный индекс осуществляется достаточно быстро, поскольку данные строки находятся на той же странице, к которой приводит поиск по индексу. Во многих базах данных информация и индексная запись традиционно хранятся на разных страницах. При больших размерах таблицы архитектура кластеризированных индексов часто позволяет сократить количество дисковых операций ввода/вывода по сравнению с традиционными решениями.
Записи в некластеризированных индексах (мы называем их также вторичными индексами), в InnoDB содержат значение первичного ключа для строки. InnoDB использует этот значение первичного ключа для поиска строки в кластеризированном индексе. Следует учитывать, что если первичный ключ достаточно велик, вторичные индексы будут занимать больше места.