2011-07-12 24 views
3

我需要一些幫助避免此查詢的文件。如何避免此mysql查詢的文件夾

SELECT id 
    FROM articles USE INDEX(group) 
    WHERE type = '4' 
    AND category = '161' 
    AND did < '10016' 
    AND id < '9869788' 
ORDER BY id DESC 
    LIMIT 10 

INDEX(組)是(typecategorydidid

由於ORDER BY id DESC的覆蓋索引,執行文件排序。有沒有辦法避免這種查詢文件?

+0

所有這些列的數據類型是否爲數字(例如int)?如果是這樣,請刪除查詢中所有數字周圍的引號。這將顯着加快速度。 – Asaph

+0

@Asaph:隱式轉換不太可能是一個大問題;我會刪除單引號,因爲它們給出了錯誤的印象(假設列數據類型是數字) –

+0

@OMG小馬:你確定嗎?即使對於這部分查詢:'做了<'10016'和ID <'9869788''?考慮排序數字和字符串是不同的。例如。 1 <5 <10,但是'1'<'10'<'5'。難道這不會使索引變得難以或不可能? – Asaph

回答

4

更改索引列順序。該索引對這種排序沒有用處,因爲它是第4列,並且不能按原樣使用。

。當然,這會影響指數的實用性此WHERE,因爲你需要一個平等的一個

MySQL docs之前的不平等列,你打破「你在關鍵的不連續的部位使用ORDER BY」和「用於提取行的密鑰與ORDER BY中使用的密鑰不同」

編輯:按照上面的鏈接,不能有滿足WHERE和ORDER BY的索引。它們是相互排斥的,因爲2個條件,我張貼以上

另一個建議:

  • 上ID的單列索引
  • 回到原來的指數也
  • 刪除索引提示
  • 希望優化器計算出可以使用兩個索引(「索引相交」)
+0

那麼你建議什麼順序?也許(id,did,type,category)? – Vern

+0

@Vern:最常用的列位於左側,其次使用的位置位於第二位置,依此類推。 –

+0

@OMG小馬:具體到這個查詢,什麼命令將避免文件? – Vern

0

創建dex on id並鍵入它應該適合你。 如果Id是唯一的,您還可以爲其創建主鍵。

您的查詢正在使用文件排序,因爲優化程序可能會使用您在查詢中創建的第一列索引。