【发布时间】:2016-03-10 07:40:44
【问题描述】:
我们有一个查询,它根据一个很少可用的标识符在我们的一个表中查找重复项,我们称之为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) 方法。
但是NULLs 不能互相平等!那么它为什么要尝试比较每一对行呢?
我知道如果 MySQL/MariaDB 的选择性太低,它不会使用索引。我相信这里就是这种情况。事实上,索引中只有 1 个值似乎意味着查询几乎是即时的。
该表是一个 InnoDB 表。
【问题讨论】:
-
你当前对该表的索引是什么?
标签: mysql indexing innodb mariadb