我無法找到一個方法來優化以下查詢:優化排序查詢
SELECT *
FROM tbl
WHERE type='51' AND `start`<='2012-01-19'
ORDER BY end DESC
LIMIT 5
我已經在一個單獨的索引索引的每一列(類型,開始,結束)試過了,所有的人在相同的索引,但MySQL一直告訴我,需要做文件
此查詢是不可能優化?
我無法找到一個方法來優化以下查詢:優化排序查詢
SELECT *
FROM tbl
WHERE type='51' AND `start`<='2012-01-19'
ORDER BY end DESC
LIMIT 5
我已經在一個單獨的索引索引的每一列(類型,開始,結束)試過了,所有的人在相同的索引,但MySQL一直告訴我,需要做文件
此查詢是不可能優化?
是的,只要你有在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 - 這裏是相關的章節,以您的問題
這在很大程度上取決於列類型,什麼是所有表中的,但你應該真正需要的是指數上type
,start
和end
列。
如需額外增強功能,您可以製作跨越type
和start
的索引。
單獨的索引不會幫助。Mysql一次只能使用一個索引 – zerkms
「我將試驗並學習如何創建列的最低基數(大約是唯一組合)列的順序。」 ---和原來的問題無關 – zerkms
像你這樣的人讓我不願意在線提供任何東西。 –
您是否希望我的答案是「不,不是不可能優化」:只回答「實際」問題? –
感謝您的所有答案,這讓我學到了很多關於這個問題的知識。
最後我明白了!看起來這實際上是可以優化的,或者至少刪除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
我想提出以下建議:
附加指數(type
,end
,start
)
重寫查詢:
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
有多少行是在表中? –
該表包含約40.000行 – jmserra