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