您能否创建一个索引来确定 mysql 中的文本列是否为空?
Can you create an index to determine if a text column is null in mysql?
我有一个非常大的(> 1 亿行)table,我需要编写的查询需要检查 TEXT
类型的列是否为空。我不关心实际文本,只关心列值是否为 null。
我正在尝试编写一个索引来提高查询的效率,我希望仅通过查看索引来满足查询,例如这样查询的 explain output 显示 Using index
而不是 Using index condition
.
具体来说,我正在处理的 table 具有如下结构:
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
。
有什么我可以做的更好的事情吗?
我怀疑这会是一个很好的 "prefix" 索引应用程序。 (大多数使用此类的尝试都以失败告终。)
我认为最佳顺序是:
INDEX(active, -- handle the entire WHERE first
overridden(1), -- IS NULL possibly works well
rowState) -- to make index "covering"
Using index condition
表示行的选择是在引擎中处理的,而不是 "Handler".
EXPLAIN FORMAT=JSON SELECT ...
可能会更深入地了解正在发生的事情。 "Optimizer trace".
也可能如此
或者...
如果 MySQL 版本足够新,则创建一个 "generated column" 并持续使用 overridden IS NULL
的计算值。
我有一个非常大的(> 1 亿行)table,我需要编写的查询需要检查 TEXT
类型的列是否为空。我不关心实际文本,只关心列值是否为 null。
我正在尝试编写一个索引来提高查询的效率,我希望仅通过查看索引来满足查询,例如这样查询的 explain output 显示 Using index
而不是 Using index condition
.
具体来说,我正在处理的 table 具有如下结构:
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
。
有什么我可以做的更好的事情吗?
我怀疑这会是一个很好的 "prefix" 索引应用程序。 (大多数使用此类的尝试都以失败告终。)
我认为最佳顺序是:
INDEX(active, -- handle the entire WHERE first
overridden(1), -- IS NULL possibly works well
rowState) -- to make index "covering"
Using index condition
表示行的选择是在引擎中处理的,而不是 "Handler".
EXPLAIN FORMAT=JSON SELECT ...
可能会更深入地了解正在发生的事情。 "Optimizer trace".
或者...
如果 MySQL 版本足够新,则创建一个 "generated column" 并持续使用 overridden IS NULL
的计算值。