33 lines
2.7 KiB
Markdown
33 lines
2.7 KiB
Markdown
|
---
|
|||
|
aliases:
|
|||
|
tags:
|
|||
|
- зрелость/🌱
|
|||
|
date:
|
|||
|
- - 2024-06-16
|
|||
|
zero-link:
|
|||
|
- "[[00 MySQL]]"
|
|||
|
parents:
|
|||
|
linked:
|
|||
|
---
|
|||
|
![Архитектура](Архитектура%20MySQL.md#^42f122)
|
|||
|
|
|||
|
Индексы реализуются на уровне движка хранилища, они не стандартизованы. Каждый движок может предоставлять свою реализацию одного и того же индекса. Например, 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](B-tree.md))
|
|||
|
|
|||
|
Используются [покрывающие индексы](Покрывающий%20индекс.md)
|
|||
|
|
|||
|
[Extended keys MySQL](Extended%20keys%20MySQL.md)
|
|||
|
|
|||
|
**Когда индексы не работают?**
|
|||
|
- Часть выражения: id + 1 = 3.
|
|||
|
- Когда есть преобразование типов: key_str = 15
|
|||
|
- Несоответсвие кодировок
|
|||
|
- Не используется левая часть [составного индекса](Составные%20индексы%20в%20MySQL.md): index(a,b); where b = 5;
|
|||
|
- Поиск по суффиксу: '%x'
|
|||
|
- Сравнение с исходной таблицей: t.key = t.col
|
|||
|
|
|||
|
Например, A in (0,1) и А between 0 and 1 – это эквивалентные формы, это диапазон и там, и там, но в случае, когда это A in (0,1) – список, он понимает, что это не диапазон, а заменяет на множественное условие равенства. В этом случае он будет использовать индекс. Это еще один нюанс MySQL, т.е. нужно смотреть, как писать – либо списком, либо ставить <> . Он это различает.
|