digital-garden/_inbox/Индексы в MySQL.md

2.7 KiB
Raw Blame History

aliases tags date zero-link parents linked
зрелость/🌱
2024-06-16
00 MySQL

Архитектура

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

[!WARNING] Дублирование индексов MySQL никак не управляет дублированием индексов. Например, если создать таблицу с PK, а потом создать на PK индекс и UNIQUE(PK), то мы получим не один, а 3 одинаковых индекса.

Если у нас есть index(A) и index(A,B), то index(A) будет лишним, потому что в случае index(A,B) часть А может использоваться в нем. (если оба B-tree)

Используются покрывающие индексы

Extended keys MySQL

Когда индексы не работают?

  • Часть выражения: id + 1 = 3.
  • Когда есть преобразование типов: key_str = 15
  • Несоответсвие кодировок
  • Не используется левая часть составного индекса: index(a,b); where b = 5;
  • Поиск по суффиксу: '%x'
  • Сравнение с исходной таблицей: t.key = t.col

Например, A in (0,1) и А between 0 and 1 это эквивалентные формы, это диапазон и там, и там, но в случае, когда это A in (0,1) список, он понимает, что это не диапазон, а заменяет на множественное условие равенства. В этом случае он будет использовать индекс. Это еще один нюанс MySQL, т.е. нужно смотреть, как писать либо списком, либо ставить <> . Он это различает.