为什么mysql总是选择“isnull”列索引而不是“join”列索引?

a7qyws3x  于 2021-06-20  发布在  Mysql
关注(0)|答案(1)|浏览(351)

关于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 两者都有100000-1000000行,其中许多行都匹配。 TableB.customer_id 几乎都是空的。
mysql选择索引的具体原因是什么 customer_id 在这种情况下?
有什么关于 is NULL 条款vs = TableA.id 使它认为这会更有用的条款?
我本以为它会选择 id 因为这是要与另一个表进行比较的列,并且需要特定值的是该列,而不仅仅是null和notnull。

mwg9r5ms

mwg9r5ms1#

上的索引 TableB.id 与…无关

on TableB.data_id = TableA.data_id
and TableB.customer_id is NULL

取而代之的是这个综合指数:

INDEX(data_id, customer_id)

相关问题