Есть таблица :
id | name | age
1 | Den | 29
2 | Alyona | 15
3 | Putin | 89
4 | Petro | 12
Есть запрос :
SELECT * FROM users WHERE age <= 29 AND gender = 'male'
Дабы выборка осуществлялась быстрее хочу использовать составной индекс:
CREATE INDEX age_gender ON users(age, gender); или
CREATE INDEX age_gender ON users(gender, age);
Вопрос:
Почему более правильно использовать 2-й случай?
Почему если age стоит первым, то не проводится индексация по полю gender?
(Понимаю , что загвоздка в том, что age ограничивается диапазоном, но не пойму конкретнее)
Ответ
В mysql индекс представляет собой B-tree(по крайней мере, тот который строите Вы). В MySQL есть ограничения при использовании B-tree индекса:
при поиске по одному полю может использоваться только самая левая часть ключа(если индекс по (a,b) нельзя искать по b)
нельзя пропускать столбцы индекса(если индекс по (a,b,c), при поиске по a,c использует индекс только для a)
индекс будет использовать поля слева направо до первого поиска по диапазону, например a>10 или a LIKE 'word%' (Это Ваш случай. Если индекс по (age, gender), поиск age <= 29 AND gender = 'male', то первый поиск по дапазону происходит по полю age, а значит остальная часть индекса не сможет быть использована)
Я описал также случаи, которые не относятся к Вашему вопросу. Надеюсь будут полезны в будущем.
Если кто-то вспомнит ещё какие-то правила - пишите в комментах, добавлю сюда.
Комментариев нет:
Отправить комментарий