为什么MySQL会继续在“ JOIN”列索引上选择“ is NULL”列索引?

时间:2018-09-05 20:49:10

标签: mysql sql indexing query-optimization

关于堆栈溢出,已经回答了许多问题,这些问题讨论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.idTableB.customer_id上有一个索引。 MySQL数据库一直选择使用TableB.customer_id上的索引。这会使查询的运行缓慢而痛苦,而如果我强迫它使用TableB.id上的索引,它将很快。

TableATableB都有100,000-1,000,000行,并且其中许多行都匹配。 TableB.customer_id几乎都是NULL。

在这种情况下,MySQL是否选择customer_id上的索引的特定原因?

关于is NULL子句和= TableA.id子句,是否有一些东西使它认为这会更有用?

我本以为它会选择id上的索引,因为那是与另一个表进行比较的列,并且该列需要特定的值,而不仅仅是NULL与NOT NULL。 / p>

1 个答案:

答案 0 :(得分:0)

lazy var ciContext: CIContext = { [unowned self] in return CIContext(mtlDevice: self.device!, options:[.cacheIntermediates:false]) }() 上的索引与

无关
TableB.id

请使用以下综合索引:

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