在stackoverflow上已经回答了许多问题,这些问题讨论了SQL如何通过使用表上的各种统计数据来选择索引,并估计每个索引将有多大帮助。我希望通过一个更具体的问题,有人能够确切地阐明这是如何适用于我的情况的。
该查询如下所示:
SELECT *
FROM TableA
LEFT JOIN TableB
on TableB.data_id = TableA.data_id
and TableB.customer_id is NULL
WHERE TableB.id is NULL在TableB.id和TableB.customer_id上有一个索引。MySQL数据库一直选择使用TableB.customer_id上的索引。这会导致查询运行慢得令人痛苦,而如果我强制它在TableB.id上使用索引,它就会很快。
TableA和TableB都有100,000 - 1,000,000行,其中许多行都是匹配的。TableB.customer_id几乎都是空的。
在这种情况下,MySQL选择customer_id上的索引是否有特定的原因?
is NULL子句和= TableA.id子句有没有什么让它觉得这样更有用的地方呢?
我本以为它会选择id上的索引,因为这是与另一个表进行比较的列,并且该列需要一个特定值,而不仅仅是NULL和NOT NULL。
发布于 2018-09-21 04:29:20
TableB.id上的索引与
on TableB.data_id = TableA.data_id
and TableB.customer_id is NULL取而代之的是这个综合指数:
INDEX(data_id, customer_id)https://stackoverflow.com/questions/52193196
复制相似问题