@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

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

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

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

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

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

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

Похожие вопросы