InnoDB:
При AUTO_INCREMENT
PRIMARY KEY
«следующая» строка будет помещена в «конец» BTree, который содержит данные для таблицы.Это эффективно, и «последний» блок будет много обновлен.
Примечание: блоки хранятся в buffer_pool, чтобы быть в конечном итоге записанными на диск.
При «случайном» PK, таком как GUID, UUID, MD5, SHA1 и т. Д., «Следующая» строка, которую нужно вставить, должна перейти в какое-то «случайное» место в BTree, содержащем данные.Если buffer_pool достаточно большой, то необходимый блок все равно будет находиться в нем.Таким образом, эффективность не сильно отличается от AI.
С другой стороны, если данные слишком велики, чтобы поместиться в buffer_pool (или другое действие продолжает выгружать блоки), тогда вставка должна будетполучить блок перед его модификацией.
Если, например, таблица в 20 раз больше, чем может храниться в buffer_pool, то следующая случайная запись будет иметь вероятность 1 из 20 блокакэшируются.То есть в 95% случаев INSERT
должен ждать чтения диска.
Но ... Вы вызвали обсуждение INSERTs
.А как насчет SELECTs
?Какой, если есть, шаблон есть для выбора?В любом случае, если он «случайный», тип PK не имеет значения.Если, с другой стороны, выборки имеют тенденцию достигать «недавних» элементов (например, новостных статей), то ИИ выигрывает для больших таблиц из-за повышенной вероятности кэширования нужного блока.
Cluster
Комментарий подразумевает некоторую путаницу по поводу «cluster / ed / ing».Некоторые определения (в контексте MySQL / MariaDB):
- Группа серверов с одинаковыми данными, работающими вместе.NDB Cluster vs Galera Cluster vs Clustrix (стороннее предложение)
- «Кластерный индекс» - это когда данные присоединены к индексу.В InnoDB PK всегда кластеризован с данными.(Примечание: MyISAM и другие поставщики не обязательно делают это.)
- Когда извлекаемые записи располагаются рядом друг с другом в макете на диске (считают PK или вторичным индексом), то эти строки «сгруппированы вместе».Это стоит отметить, потому что выборка одного блока получает несколько нужных вам строк.
Итак, вернемся к комментарию:
- Прыжки по
PRIMARY KEY
(из-заиспользование того, что я назвал случайным PK, или из-за того, что строки просто не выбираются в некотором соответствующем порядке), застревает в прыжках по таблице. - UUID имеет «отсортированный порядок», но это бесполезно длямного всего.