2012-01-19 52 views
2

我無法找到一個方法來優化以下查詢:優化排序查詢

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

我已經在一個單獨的索引索引的每一列(類型,開始,結束)試過了,所有的人在相同的索引,但MySQL一直告訴我,需要做文件

此查詢是不可能優化?

+2

有多少行是在表中? –

+0

該表包含約40.000行 – jmserra

回答

1

是的,只要你有在WHERE範圍比較和排序其他領域 - mysql不能使用索引進行排序。

它可以,如果你有WHERE type='51' AND開始='2012-01-19' ORDER BY end DESCWHERE type='51' AND開始<= '2012-01-19' ORDER BY start DESC

http://dev.mysql.com/doc/refman/5.5/en/order-by-optimization.html - 這裏是相關的章節,以您的問題

0

這在很大程度上取決於列類型,什麼是所有表中的,但你應該真正需要的是指數上typestartend列。

如需額外增強功能,您可以製作跨越typestart的索引。

+1

單獨的索引不會幫助。Mysql一次只能使用一個索引 – zerkms

0

我首先想到的是(*)擴大到不在行索引。

如果不是,您肯定會受益於Multiple-Column Index

我會試驗並學習如何創建索引定義中具有最低基數(大約是唯一組合)列的順序。

+0

「我將試驗並學習如何創建列的最低基數(大約是唯一組合)列的順序。」 ---和原來的問題無關 – zerkms

+0

像你這樣的人讓我不願意在線提供任何東西。 –

+0

您是否希望我的答案是「不,不是不可能優化」:只回答「實際」問題? –

0

感謝您的所有答案,這讓我學到了很多關於這個問題的知識。

最後我明白了!看起來這實際上是可以優化的,或者至少刪除EXPLAIN句子中的using filesort

這是我使用的指標:

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行),整個表的大小小於3MB,但我認爲這是一個很好的例子,因爲我有很多更多像這樣的更大更復雜的表格,現在我可以開始處理它們了 – jmserra

0

我想提出以下建議:

  1. 附加指數(typeendstart

  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