[英]Slow sql query despite indexes
我堅持使用簡單的SQL查詢。
查詢:
SELECT * FROM company
WHERE
(IDCompanyMain in (ID1, ID2...) or IDCompany in (ID1, ID2...))
and Network="XXX";
每個字段都有索引,大約有10M行。 每個查詢都有1到100個ID。
每個查詢需要> 4秒! 如果我刪除其中一個條件,結果就會在幾毫秒內完成。
EXPLAIN說,mysql使用網絡索引並且有大約5M行。 如果嘗試強制某個索引(USE或FORCE),則不使用索引。
我做錯了什么?
說明:
id, select_type, table, type, possible_keys, key, key_len, ref, rows, Extra
'1', 'SIMPLE', 'company', 'ref', 'PRIMARY,UNetwork_ID,IIDCompanyMain,INetwork', 'INetwork', '98', 'const', '5270286', 'Using where'
只使用一個索引 - 用於“ Network
列。
由於OR
子句,不能使用IDCompanyMain
和IDCompany
索引。 您必須為每個條件執行兩個單獨的查詢,然后將結果連接在一起:
(SELECT * FROM company WHERE IDCompanyMain in (ID1, ID2...) and Network="XXX")
UNION
(SELECT * FROM company WHERE IDCompany in (ID1, ID2...) and Network="XXX")
為獲得最佳查詢性能,您需要兩個復合索引 - (Network,IDCompanyMain)和(Network,IDCompany)
EXPLAIN結果表明只有網絡字段索引用於檢查(參見key
列),使檢查對超過5百萬行進行運行,這就是為什么它如此緩慢。
您應該考慮創建一個使用索引中的兩個字段的索引,每個索引只有索引1字段的索引。 例如: CREATE INDEX index_1 ON t1 (c1, c2);
所以在你的情況下:
CREATE INDEX maincompany_network ON company (IDCompanyMain, Network);
CREATE INDEX company_network ON company (IDCompany, Network);
然后再次EXPLAIN以查看它是否改進了您的rows
。
我建議為網絡和主公司創建兩個索引,另一個為網絡和公司,因為這是你的OR評估方式。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.