我们有一个查询在我们的一个表中查找重复项,基于很少可用的标识符,让我们调用它rareIdentifier INT(10) UNSIGNED NULL
.我们在此列上有一个单列常规旧索引.
有问题的查询如下所示:
SELECT a.id, b.id FROM widget a INNER JOIN widget b ON a.rareIdentifier = b.rareIdentifier;
问题是,对于最近的重复查找运行,我们实际上有0
一个值为的行rareIdentifier
; 即所有行都有NULL
此列.MariaDB决定不使用索引,选择Using join buffer (flat, BNL join)
扫描整个表格的方法.
但是NULL
s不能相等!那么为什么要尝试比较每对行呢?
据我所知,如果MySQL/MariaDB的选择性太低,它将不会使用索引.我相信这就是这种情况.实际上,似乎在索引中只有1个值意味着查询几乎是瞬时的.
该表是InnoDB表.