我在MySQL查詢看起來是這樣的:如何選擇SQL查詢正確的索引與ORDER BY子句(MySQL的)
SELECT t.field1, t.field2, t.field5, t.field6, t.field7
FROM mytable as t
WHERE t.field1 = a AND t.field2 = b AND t.field3 = c AND LENGTH(t.field4) > 0
order by t.field5 desc
LIMIT 0, 100;
查詢不是非常快(10秒)和問題似乎是ORDER BY部分,沒有這一行查詢需要0.01秒,使用ASC而不是desc需要大約1秒。
我已經在查詢的WHERE/ORDER BY部分中以與它們在查詢(field1,field2,field3,field4,field5)中出現的順序相同的順序創建了索引,但它沒有被使用根據MySQL中的「解釋」。 (field1)有很高的基數(有100個不同值的整數)field2和field3是BOOLEAN,field5是一個高基數的字符串(但是LENGTH(field5)> 0使得基數低或?)。
單獨的field5上還有一個索引,這是查詢如上所示的唯一索引,刪除查詢的ORDER BY部分將使MySQL使用多列索引。
缺少什麼我在這裏?
編輯:這是實際的SQL:
SELECT t.shopid, t.isproduct, t.level, t.isduplicate, t.ref_id
FROM urls as t
WHERE t.shopid = 72 AND t.isproduct = 1 AND t.visited = 0 AND LENGTH(t.url) > 0
ORDER BY t.level desc
LIMIT 0, 100;
'LENGTH(t.field4)> 0'與'(t.field4不是null和t.field4!=「」)相同,那麼索引應該能夠使用它。 – Ashalynd
當你開始進入複雜的查詢和優化時,上下文就是一切。我建議你用你的真實查詢來替換你的psuedo-sql示例,因爲幾乎不可能給出直接的答案(即知道這些字段中的一個是否是ID主鍵,當幫助時可能是非常寶貴的信息) – Lee
不,那裏沒有聚集索引。我的方法是否正確地將ORDER-BY字段作爲索引的最後一個字段? 這可以解決使用子查詢,而不是? – Andreas