Основы ..
ПЕРВИЧНЫЙ КЛЮЧ MyISAM и вторичные ключи работают одинаково. - Оба являются BTrees в файле .MYI
, где «указатель» в листовом узле указывает на файл .MYD
.
«Указатель» - это либо смещение байта в файле .MYD
, либо номер записи (для FIXED
). Либо приводит к «поиску» в файле .MYD
.
Данные InnoDB, включая столбцы PRIMARY KEY
, хранятся в одном BTree, заказанном PK.
Это делает поиск ПК немного быстрее. Оба просматривают BTree, но MyISAM нужен дополнительный поиск.
Каждый вторичный ключ InnoDB хранится в отдельном BTree. Но в этом случае листовые узлы содержат дополнительные столбцы PK. Итак, поиск вторичного ключа сначала детализирует это BTree на основе вторичного ключа. Там он найдет все столбцы как вторичного ключа, так и первичного ключа. Если - это все нужные вам столбцы, это «индекс покрытия» для запроса, и больше ничего не делается. (Быстрее, чем MyISAM.)
Но обычно вам нужны другие столбцы, поэтому столбцы столбца PK используются для детализации данных / PK BTree, чтобы найти остальные столбцы в строке. (Медленнее, чем MyISAM.)
Итак, есть некоторые случаи, когда MyISAM выполняет меньше работы; некоторые случаи, когда InnoDB выполняет меньше работы. Там происходит много других вещей; InnoDB побеждает во многих сравнительных тестах над MyISAM.
Кэширование ...
MyISAM управляет кэшированием блоков индекса размером 1 КБ в key_buffer. Блоки данных кэшируются операционной системой.
InnoDB кэширует как блоки данных, так и вторичные индексы (16 КБ в обоих случаях) в buffer_pool.
«Кэширование» относится к замене блоков ввода / вывода по мере необходимости с использованием алгоритма «наименее недавно использованного».
BTree не загружен в RAM. Нет BTree явно хранится в оперативной памяти. Каждый блок запрашивается по мере необходимости, с надеждой , что он кэшируется в ОЗУ. Для данных и / или индексов, которые меньше соответствующего буфера (key_buffer / buffer_pool), BTree может случиться, что останется в ОЗУ до завершения работы.
Источник истины находится на диске. (Хорошо, есть сложные приемы, которые InnoDB использует с файлами журналов, чтобы избежать потери данных, когда происходит сбой до сброса блоков на диск. Эта очистка автоматически происходит при перезапуске после сбоя.)
Потянув за вилку ..
MyISAM:
Беспорядок № 1: Индексы останутся в нечистом состоянии. CHECK TABLE
и REPAIR TABLE
необходимы.
Беспорядок # 2: Если вы находитесь в середине UPDATEing
тысячи строк в одном выражении, некоторые будут обновлены, некоторые - нет.
InnoDB:
Как упомянуто выше, InnoDB выполняет действия атомарно , даже при потягивании штекера. Ни один индекс не остался поврежденным. Нет UPDATE
оставлено недоделанным; это будет ROLLBACKed
.
Пример ..
Учитывая
columns a,b,c,d,e,f,g
PRIMARY KEY(a,b,c)
INDEX(c,d)
Листовые узлы BTree будут содержать:
MyISAM:
для ПК: a,b,c,pointer
для среднего: c,d,pointer
InnoDB:
для ПК: a,b,c,d,e,f,g
(вся строка хранится в ПК)
для среднего: c,d,a,b