加速对 mysql 数据库中文本字段的 NOT NULL 查询

chr*_*aly 2 mysql

我有一个这样的查询:

select count(*) from people where text_field is not null;
Run Code Online (Sandbox Code Playgroud)

它很慢。在 mediumtext 字段上放置索引是否符合犹太教规?最好的做法是什么?

O. *_*nes 6

这个is not null查询谓词因无法索引而臭名昭著。那是因为 SQL 中的空比较不是直观的。

最好的办法是找出其他方法来找到这些非空的 text_field 值。如果此查询需要经常运行,则需要存储某种标志值。

例如,添加一个名为 text_field_length 的 INT 列并用 text_field 的长度填充它,然后选择 where text_field_length > 0

八年后编辑

较新版本的 MySQL (5.7 +) 和 MariaDB 现在具有计算列。那些计算列可以被索引。

因此,您可以text_field_not_nullpeople表中添加一个计算列(可能称为 ),并在该列上添加一个索引。

ALTER TABLE people add column text_field_not_null INT
        AS (IF(text_field IS NULL,0,1)) STORED;
CREATE INDEX text_field_not_null_dex ON people(text_field_not_null);
Run Code Online (Sandbox Code Playgroud)

然后,此查询将利用该新索引。

 SELECT COUNT(*) FROM people WHERE text_field_not_null = 1;
Run Code Online (Sandbox Code Playgroud)

而且,这个新列的值会自动处理。

(在这方面,MySQL 几乎赶上了昂贵的表服务器。)