@VisualIdeas

Почему MySQL не использует индексы?

Имеется табличка:
5cf2576d510b5230212138.png

Для неё созданы индексы:
5cf257d4f3db4764190942.png

Но при выполнении запроса:
SELECT `place`.`id`, `place`.`root`, `place`.`lft`, `place`.`rgt`, `place`.`level`, `place`.`type`, `place`.`slug`, `place`.`latitude`, `place`.`longitude`, `place`.`time_zone_id`, `place`.`count_views` 
FROM `my_geoservices`.`place` 
WHERE `place`.`rgt` >= 29602 AND `place`.`root` = 2


MySQL отказывается использовать индексы:
5cf2589bddc5a109679701.png

Причем индекс даже есть в посибле кейс ((((
  • Вопрос задан
  • 123 просмотра
Решения вопроса 1
BorLaze
@BorLaze
Java developer
Очень часто встречается заблуждение, что если есть индекс, то он используется всегда.

Ничего подобного. Более того, даже в одинаковом запросе, но с разными данными, индекс может как учитываться, так и нет.

Например, имеем мы миллион записей с булевым полем, и индекс по нему (глупость, конечно, но для примера в самый раз). И из этого миллиона пять записей имеют в этом поле true, а остальные false.

Так вот, select * from table where boolField = true индекс задействует, а вот select * from table where boolField = false - уже нет. Потому что, с точки зрения оптимизатора, искать сначала в индексе, а потом в таблице оправдано для пяти позиций, но совершенно избыточно делать практически одну и ту же работу для 999 995 записей.

Это, конечно, на пальцах, но смысл примерно такой.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

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