![](/img/trans.png)
[英]How to query an index in WHERE and ORDER BY clause in MySQL?
[英]How to choose correct index for SQL query with ORDER BY clause (MySQL)
我在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;
在不真正知道表大小和數據類型的情況下,很難預測查詢性能。 Mysql優化器有自己的方法來決定使用哪個索引,總體來說這是相當不錯的。 您可以通過強制MySQL使用FORCE INDEX
來使用各種索引來進行嘗試。 出於明顯的原因,永遠不能使用t.url上的索引。
您可以嘗試的一件事是:
select t.field1, t.field2, t.field5, t.field6, t.field7 from (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) t order by t.field5 desc LIMIT 0, 100;
通常不建議這樣做,但是如果輸出行數不多,可以為您提供幫助。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.