2013-03-30 2 views
1

Я борюсь с оптимизацией запроса MySQL.MySQL оптимизация запросов слева объединены индексы

select * 
from course as t1 
left join semester as t3 on t1.semester=t3.id 
where t1.visibleFrom <= '1364621522' 
and '1364621522' <= t1.visibleTo 
order by t3.begin desc, t1.name; 

Об этом сообщает EXPLAIN использовать ALL-запрос на таблицу курсов. Таблица имеет несколько разных индексов (visibleFrom, visibleTo, сочетание обоих, имя, семестр). name является столбцом varchar, begin, visibleFrom и visibleTo являются целыми числами, которые также могут быть нулевыми.

Если я откажусь от присоединения к t3 и принудительно использовать имя индекса, оно работает как-то.

Любые идеи, почему этот запрос не использует индексы?

ответ

1

Я считаю, что важным показателем для ограничения диапазона в WHERE является индекс по двум столбцам visibleFrom и visibleTo, т.е.

ALTER TABLE `course` ADD INDEX (`visibleFrom` , `visibleTo`); 

Если MySQL не использует его в запросе, мое предположение было бы что таблица курса имеет менее ~ 100 строк. Поэтому оптимизатор запросов MySQL решает не использовать индекс из-за накладных расходов. Как только таблица курсов содержит несколько сотен строк, следует использовать индекс.

Смежные вопросы