#mysql
#mysql — сервер
Вопрос:
Сегодня я наткнулся на запрос, который использует условия where в двух столбцах. Вот пример запроса:
select * from users where age = 21 and consent_given = 1;
У меня есть индекс по возрасту и индекс по consent_given. Когда я запускаю explain
этот запрос, он использует index_merge обоих этих индексов.
Примечание по поводу проблемы дублирования: это слияние индексов происходит только в том случае, если достаточное количество пользователей удовлетворяет этим условиям; таблица, которую я использую, содержит около 2,5 миллионов строк, и 3500 из них соответствуют условиям.
Я обнаружил, что этот запрос выполняется намного быстрее, если он использует только age_index
и не объединяется, чтобы также использовать consent_given_index
.
Я уже выяснил несколько способов оптимизировать этот запрос (создать составной индекс, подсказать использовать индекс возраста, удалить индекс consent_given, что-нибудь еще?), Но что действительно ставит меня в тупик — почему приведенный ниже запрос не использует индекс consent_given, а использует только индекс age, следовательно, оптимизируя запрос?
select * from users where age = 21 and consent_given;
Разве consent_given
не следует делать то же самое, что и consent_given = 1
? Когда я запускаю explain
это, consent_given_index даже не указан в разделе possible_keys — mysql не считает его доступным индексом. Кто-нибудь может объяснить разницу в MySQL между указанием =1
и неуказанием в отношении индексов?
Заранее спасибо!
Обновить
Выходные данные для первого запроса объясняют:
id => 1
select_type => SIMPLE
table => users
type => index_merge
possible_keys => users_age_index, users_consent_given_index
key => users_age_index, users_consent_given_index
key_len => 767,1
ref => NULL
rows => 1,886
extra => Using intersect(users_age_index,users_consent_given_index); Using where
Вывод для второго запроса объясняет:
id => 1
select_type => SIMPLE
table => users
type => ref
possible_keys => users_age_index
key => users_age_index
key_len => 767
ref => const
rows => 3,774
extra => Using index condition; Using where
Комментарии:
1. поделитесь планом запроса
2. @ZaynulAbadinTuhin только что добавил объяснительные выходные данные — этого достаточно информации?
3. какой у вас левый столбец во время создания индекса? это (возраст,consent_given) или (consent_given, возраст)
4. Это возраст, завершено
5. users_age_index это означает, что это ваше составное имя ключа, я прав?