你能创建一个索引来确定mysql中的文本列是否为null?

问题描述 投票:0回答:1

我有一个非常大(> 1亿行)的表和我需要编写的查询需要检查TEXT类型的列是否为null。我不关心实际文本,只有当列值为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

我能做些什么更好的事情吗?

mysql indexing isnull
1个回答
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值。

© www.soinside.com 2019 - 2024. All rights reserved.