В MySQL, в чем разница между «ГДЕ my_bool_col = 1» и «ГДЕ my_bool_col»

#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 это означает, что это ваше составное имя ключа, я прав?