尽管有索引但SQL查询速度慢

时间:2018-08-01 12:43:02

标签: mysql

我坚持使用简单的SQL查询。

查询:

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

每个字段上都有索引,大约有1000万行。 每个查询有1到100个ID。

每个查询需要> 4秒!如果我删除其中一个条件,结果将在几毫秒内完成。

EXPLAIN说,mysql使用网络索引,并且有大约500万行有问题。如果尝试强制使用某些索引(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'

2 个答案:

答案 0 :(得分:2)

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)

答案 1 :(得分:1)

EXPLAIN结果表明,检查中仅使用了网络字段索引(请参阅key列),这使得检查针对500万行以上的行进行了,这就是为什么它如此缓慢的原因。

您应该考虑创建一个使用索引中两个字段的索引,每个索引只有一个索引1字段。 例如:{{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); 列。

我建议创建两个索引,一个用于网络和maincompany,另一个用于网络和公司,因为这是评估您的OR的方式。