2

我有一个这样的查询:

select count(*) from people where text_field is not null;

它很慢。在 mediumtext 字段上放置索引是否符合规定?这方面的最佳做法是什么?

4

4 回答 4

8

这个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 在这方面几乎赶上了昂贵的表服务器。)

于 2012-08-21T03:26:35.750 回答
0

由于 Mysql 是一个“旧锡罐”,我们不得不添加一个带有索引和触发器的 BOOLEAN 类型的辅助字段:

IF NEW.text_field='' THEN 
SET NEW.boolean_field = 1;
ELSE
SET NEW.boolean_field = 0;
END IF
于 2019-04-11T03:54:11.453 回答
-3

您将使用此查询

   select count(*) from people where text_field not like "";

祝你好运!

于 2014-04-17T10:18:46.157 回答
-3

我希望你使用这种类型的查询

从 text_field 不为空的人中选择 count(*);

请添加过滤子句以获得更好的性能

于 2019-04-11T04:23:40.170 回答