您可以创建索引以确定MySQL中文本列是否为空吗?

时间:2019-04-22 22:56:20

标签: mysql indexing isnull

我有一个非常大的表(> 1亿行),需要编写的查询需要检查类型TEXT的列是否为空。我不关心实际的文本,仅当列值是否为null时。

我正在尝试编写索引以使该查询高效,并且我希望仅通过查看索引来满足该查询,例如这样该查询的explain output会显示Using index而不是Using index condition

具体来说,我要处理的表具有这样的结构:

CREATE TABLE foo (
    id INT NOT NULL AUTO_INCREMENT,
    overridden TEXT,
    rowState VARCHAR(32) NOT NULL,
    active TINYINT NOT NULL DEFAULT 0,
    PRIMARY KEY (id),
) ENGINE=InnoDB

我想要的查询是这样:

SELECT 
    IF(overridden IS NULL, "overridden", rowState) AS state, 
    COUNT(*)
FROM foo 
WHERE active=1
GROUP BY state

overridden列说明了为什么该列被覆盖,但是,正如我上面提到的,我不在乎其内容,我只想将其用作布尔值标志。

我尝试在(active, rowState, overridden(1))上创建索引,但说明输出仍然显示Using index condition

我能做些更好的事情吗?

1 个答案:

答案 0 :(得分:0)

我怀疑这对于“前缀”索引将是一个很好的应用。 (使用此类工具的大多数尝试都是惨败。)

我认为最佳顺序是:

INDEX(active,         -- handle the entire WHERE first
      overridden(1),  -- IS NULL possibly works well
      rowState)       -- to make index "covering"

Using index condition表示对行的选择是在引擎中处理的,而不是“处理程序”。

EXPLAIN FORMAT=JSON SELECT ...可以提供更多有关发生情况的信息。 “优化程序跟踪”也可能如此。

或...

如果MySQL版本足够新,请创建一个“生成的列”,并以计算值overridden IS NULL保留。