我有一个这样的查询:
select count(*) from people where text_field is not null;
Run Code Online (Sandbox Code Playgroud)
它很慢。在 mediumtext 字段上放置索引是否符合犹太教规?最好的做法是什么?
这个is not null查询谓词因无法索引而臭名昭著。那是因为 SQL 中的空比较不是直观的。
最好的办法是找出其他方法来找到这些非空的 text_field 值。如果此查询需要经常运行,则需要存储某种标志值。
例如,添加一个名为 text_field_length 的 INT 列并用 text_field 的长度填充它,然后选择 where text_field_length > 0
八年后编辑
较新版本的 MySQL (5.7 +) 和 MariaDB 现在具有计算列。那些计算列可以被索引。
因此,您可以text_field_not_null向people表中添加一个计算列(可能称为 ),并在该列上添加一个索引。
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 几乎赶上了昂贵的表服务器。)
| 归档时间: |
|
| 查看次数: |
2628 次 |
| 最近记录: |