我有一个这样的查询:
select count(*) from people where text_field is not null;
它很慢。在 mediumtext 字段上放置索引是否符合规定?这方面的最佳做法是什么?
我有一个这样的查询:
select count(*) from people where text_field is not null;
它很慢。在 mediumtext 字段上放置索引是否符合规定?这方面的最佳做法是什么?
这个is not null
查询谓词因无法索引而臭名昭著。这是因为 SQL 中的 null 比较不直观。
最好的办法是找出其他方法来查找这些非空 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);
然后,此查询将利用该新索引。
SELECT COUNT(*) FROM people WHERE text_field_not_null = 1;
而且,这个新列的值会自动处理。
(MySQL 在这方面几乎赶上了昂贵的表服务器。)
由于 Mysql 是一个“旧锡罐”,我们不得不添加一个带有索引和触发器的 BOOLEAN 类型的辅助字段:
IF NEW.text_field='' THEN
SET NEW.boolean_field = 1;
ELSE
SET NEW.boolean_field = 0;
END IF
您将使用此查询
select count(*) from people where text_field not like "";
祝你好运!
我希望你使用这种类型的查询
从 text_field 不为空的人中选择 count(*);
请添加过滤子句以获得更好的性能