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
几乎全部为 NULL。
在这种情况下,MySQL 选择 customer_id
上的索引是否有特定原因?
is NULL
子句与 = TableA.id
子句相比,有什么东西让它认为这会更有用吗?
我本以为它会选择 id
上的索引,因为这是与另一个表进行比较的列,并且它是需要特定值的列,而不仅仅是 NULL 与 NOT空。
最佳答案
TableB.id
上的索引与以下内容无关
on TableB.data_id = TableA.data_id
and TableB.customer_id is NULL
相反,有这个复合索引:
INDEX(data_id, customer_id)
关于mysql - 为什么 MySQL 总是选择 "is NULL"列索引而不是 "JOIN"列索引?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52193196/