2013-10-17 56 views
3

建立索引我有一個具有以下模式爲什麼我不能在我已經爲

標識,INT表,主鍵

QueryId MySQL查詢去掉文件排序的,INT

CreatedTime,日期時間

和我創建化合物指數(QueryId,CreatedTim E)

怎麼說,當我運行 解釋SELECT * FROM測試,其中queryid在(1,6)由createdtime倒序

我仍然得到具有文件排序如下?任何想法我怎麼能刪除文件? 「使用,其中,使用文件排序」

Explain result

+0

MySQL的優化器已經確定對文件進行排序比遍歷索引_查詢_更快。如果查詢不同,或者表中的行數不同,MySQL可能會選擇其他操作。讓它完成它的工作 - 它幾乎肯定比你或我更好。 – 2013-10-17 01:58:13

回答

1

你還沒有真正建立,可用於該查詢的索引。

索引只能用於從最左列到右邊的查找和排序。只要遇到無用的東西,索引的其餘部分就會被忽略。

你不發表您的EXPLAIN的輸出,但我懷疑,如果正在審議的指數QueryId是INT,你會發現Key_len = 4的含義,只有最左邊的4個字節(QueryId)是有用的給優化器。

上(QueryId,CreatedTime)的指數QueryId採摘的記錄,並通過CreatedTime對它們進行排序,當且僅當您選擇了一個QueryId單價值。當你這樣做時,索引將返回與QueryId相匹配的行,這些行已經按照CreatedTime排序,並且優化器意識到這一點。相反,如果查找QueryId的多個值,則QueryId返回的行將按QueryId和,然後按每個QueryId組中的CreatedTime返回,所以進一步的filesort是必需的,因爲CreatedTime值基本上沒有有用的順序排序。如果你QueryId,CreatedTime,filesort應該消失,當然,但這可能不是你想要的。

(CreatedTime,QueryId)上的索引也無濟於事,因爲QueryId不在左邊,並且除非有非常少量的行,服務器可以拉取由CreatedTime預先排序的行,但它必須掃描所有行以查找QueryId的匹配值。

總之,你不能完全索引這樣的查詢和Using filesort是不是總能避免的東西。

+0

嗨,邁克爾,我將解釋結果圖像添加到原始問題中,請看看。我在網上發現了幾個與我一樣的情況,他們的用法與我所做的一樣,並聲稱會生效 – user2490226