由于选择性较低,MariaDB不对1列自连接使用索引(所有NULL)

sas*_*axi 6 mysql indexing innodb mariadb

我们有一个查询在我们的一个表中查找重复项,基于很少可用的标识符,让我们调用它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表.

Ran*_*eed 0

InnoDB 可能不够聪明,无法意识到比较NULL总是NULL,因此是假的。也许它只是决定“所有值都是相同的,所以它们必须相等”(但事实上我真的不知道)。

作为一种解决方法,添加... AND a.rareIdentifier IS NOT NULL应该给优化器足够的提示。