慢sql查询

dddzy1tm  于 2021-06-20  发布在  Mysql
关注(0)|答案(2)|浏览(250)

我被一个简单的sql查询的性能困住了。
查询:

SELECT * FROM company
        WHERE 
        (IDCompanyMain in (ID1, ID2...) or IDCompany in (ID1, ID2...))
        and Network="XXX";

每个字段和行上都有索引。每个查询有1到100个ID。
每个查询需要>4秒!如果我删除其中一个条件,结果将在毫秒内就绪。
解释说,mysql使用网络索引,有大约5百万行有问题。如果试图强制某个索引(使用或强制),则不使用任何索引。
我做错了什么?
解释:

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'
ryhaxcpt

ryhaxcpt1#

explain结果表明检查中只使用了network字段索引(参见 key 列),使检查针对超过500万行运行,这就是它如此缓慢的原因。
您应该考虑创建一个索引,该索引使用索引中的两个字段,每个索引只有一个索引字段。例如: CREATE INDEX index_1 ON t1 (c1, c2); 所以在你的情况下:

CREATE INDEX maincompany_network ON company (IDCompanyMain, Network);
CREATE INDEX company_network ON company (IDCompany, Network);

然后再解释一遍,看看它是否改善了你的情绪 rows 列。
我建议创建两个索引,一个是网络和主要公司,另一个是:网络和公司,因为这就是你的or的评估方式。

rkue9o1l

rkue9o1l2#

只使用了一个索引-用于 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)

相关问题