簡體   English   中英

盡管索引緩慢的SQL查詢

[英]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子句,不能使用IDCompanyMainIDCompany索引。 您必須為每個條件執行兩個單獨的查詢,然后將結果連接在一起:

(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.

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