关于堆栈溢出,已经回答了许多问题,这些问题讨论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 NULL。 / p>
答案 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