我被一个简单的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'
2条答案
按热度按时间ryhaxcpt1#
explain结果表明检查中只使用了network字段索引(参见
key
列),使检查针对超过500万行运行,这就是它如此缓慢的原因。您应该考虑创建一个索引,该索引使用索引中的两个字段,每个索引只有一个索引字段。例如:
CREATE INDEX index_1 ON t1 (c1, c2);
所以在你的情况下:然后再解释一遍,看看它是否改善了你的情绪
rows
列。我建议创建两个索引,一个是网络和主要公司,另一个是:网络和公司,因为这就是你的or的评估方式。
rkue9o1l2#
只使用了一个索引-用于
Network
列。由于
OR
条款,索引IDCompanyMain
以及IDCompany
无法使用。您必须为每个条件执行两个单独的查询,然后将结果合并在一起:为了获得最佳查询性能,您需要两个复合索引-(network,idcompanymain)和(network,idcompany)