@kirill-93

Разница в индексах mysql?

Сильно ли отличаются составные индексы от обычных?
Например, есть запрос
SELECT * FROM users WHERE age > 25 AND country = 189

Составной индекс должен быть именно age_country, а не наоборот. Но будет ли он полезен, если в другом запросе, я использую в условии только age, без country, или мне на этот случай нужен отдельный индекс на age.
И какова разница между индексом age_country и отдельно двумя индексами для age и для country?
  • Вопрос задан
  • 331 просмотр
Пригласить эксперта
Ответы на вопрос 2
@shagguboy
Но будет ли он полезен, если в другом запросе, я использую в условии только age, без country,

да
И какова разница между индексом age_country и отдельно двумя индексами для age и для country

dev.mysql.com/doc/refman/5.7/en/index-merge-optimi...
Ответ написан
Комментировать
Melkij
@Melkij
PostgreSQL DBA
Составной индекс должен быть именно age_country, а не наоборот.

Как раз наоборот.

mysql обычно использует подвид btree. У btree поиск левосторонний, т.е. по индексу age & country можно обрабатывать запросы по age. А по индексу country & age искать только age уже нельзя.

И какова разница между индексом age_country и отдельно двумя индексами для age и для country?

Вы ищете пользователей некоторой страны с возрастом от 25 лет.
Перед вами справочники:
0) пользователи отсортированы по возрасту (в пределах одного возраста - вперемешку) - вам достаточно пролистать до начала 25 лет, а дальше вчитываться в каждого пользователя и искать нужную страну. Справочник вам не поможет в этом. Индекс age
1) пользователи отсортированы по стране. Вы быстро находите всех из нужной страны, а затем вчитываетесь в каждого пользователя и смотрите возраст. Индекс country
2) пользователи отсортированы сначала по возрасту, в пределах одного возраста дополнительно отсортированы по стране. Быстренько листаете до 25 лет, в пределах каждого возраста листаете до нужной страны. Как-то не очень удобно? age & country
3) пользователи отсортированы по стране, пользователи одной страны отсортированы вдобавок по возрасту. Быстренько листаете до нужной страны, быстренько пропускаете всех младше 25 лет - читаете остаток, поглядывая только, что страна не изменилась. country & age

Какой справочник захотите использовать?
А если я скажу, что в справочнике помимо сортировки других данных пользователя нет? И чтобы по индексу country уточнить возраст пользователя вам необходимо посмотреть id человека и сходить за остальными данными в картотеку?

Вы можете взять справочник по стране, переписать все id людей, затем взять справочник по возрасту, и поискать в диапазоне от 25 лет записанные id людей. Потратите много сил на сравнение, не так ли? Вот и mysql умеет index intersect, но операция эта не бесплатная.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы