2012-01-19 3 views
2

я не мог найти способ оптимизировать следующий запрос:Оптимизация сортировки запросов

SELECT * 
FROM tbl 
WHERE type='51' AND `start`<='2012-01-19' 
ORDER BY end DESC 
LIMIT 5 

Я пытался путем индексирования каждый столбец в отдельный индекс (тип, начало, конец), и все они в том же индексе, но MySQL продолжает говорить мне, что нужно делать filesort

Невозможно ли оптимизировать этот запрос?

+2

Сколько строк в таблице? –

+0

Таблица содержит около 40.000 строк – jmserra

ответ

1

Да, если у вас есть сравнение дальности в WHERE и сортировка по другому полю - mysql не может использовать индекс для сортировки.

Он мог бы, если бы у вас был WHERE type='51' AND старт ='2012-01-19' ORDER BY end DESC или WHERE type='51' AND старта <= '2012-01-19' ORDER BY start DESC

http://dev.mysql.com/doc/refman/5.5/en/order-by-optimization.html - и вот глава, имеющим отношение к вашей проблеме

0

Это зависит от типов столбцов и всего, что есть в таблице, но все, что вам действительно нужно, это индексы на type, start и end столбцы.

Для дополнительного повышения, вы можете сделать индекс по typeиstart.

+1

Отдельные индексы не помогут.Mysql может использовать только один индекс за раз – zerkms

0

Моей первой мысль (*) расширяется в строки, которые не являются индексируются.

Если нет, вы, безусловно, получите выгоду от Multiple-Column Index.

Я бы экспериментировал и научился видеть, как создать порядок столбцов в определении индекса с наименьшей мощностью (приблизительно уникальными комбинациями) столбцов.

+0

«Я бы экспериментировал и научился видеть, как создать порядок столбцов с наименьшей мощностью (приблизительно уникальные комбинации) столбцов». --- и это не имеет никакого отношения к оригинальному вопросу. – zerkms

+0

Такие люди, как ты, заставляют меня неохотно вносить что-либо в Интернет. –

+0

Вы предпочли бы, чтобы мой ответ был «Нет, это невозможно сделать для оптимизации»: только отвечая на «фактический» вопрос? –

0

Спасибо за все ваши ответы, это заставило меня много узнать о проблеме.

И, наконец, я понял! Похоже, на самом деле это возможно для оптимизации или, по крайней мере, для удаления этого using filesort в предложении EXPLAIN.

Вот индексы я использовал:

KEY `start` (`start`), 
    KEY `typeend` (`type`,`end`) 

Теперь выполнение:

EXPLAIN SELECT * 
    FROM tbl 
    WHERE type='51' AND `start`<='2012-01-19' 
    ORDER BY end 
    DESC LIMIT 5 

ведет к:

SIMPLE tbl ref start,type,typeend typeend 5 const 19 Using where 
+0

Как долго это занимает сейчас по сравнению со временем в вопросе? – newtover

+0

Ну, время почти такое же, потому что здесь мы имеем дело с действительно небольшим количеством данных (40K строк), все размеры таблицы меньше 3 МБ, но я думал, что это отличный пример, потому что у меня много больше подобных случаев с большими и сложными таблицами, и теперь я смогу начать с ними бороться – jmserra

0

Я бы рекомендовал следующее:

  1. индекс добавить (type, end, start)

  2. переписать запрос:

    SELECT * 
    FROM (
        SELECT id -- `id` is the primary key 
        FROM tbl 
        WHERE type='51' AND `start`<='2012-01-19' 
        ORDER BY end DESC 
        LIMIT 5) as ids 
    JOIN tbl 
    USING (id); -- `id` is the primary key 
    
Смежные вопросы