簡體   English   中英

如何使用ORDER BY子句(SQL)為SQL查詢選擇正確的索引

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM