我的应用程序中有表posts
及其列descr
。我需要查询描述不为空的帖子,但表中有太多行,所以我需要添加一个索引。添加此索引的最佳方法是什么?
表结构(简化):
CREATE TABLE posts (
id INT UNSIGNED NOT NULL AUTO_INCREMENT,
title VARCHAR(255),
descr VARCHAR(1024),
PRIMARY KEY(id)
) engine=InnoDB DEFAULT CHARSET=utf8;
查询示例:
SELECT * FROM posts WHERE descr <> '';
我不想在整个descr
列上创建索引,因为这将是巨大的开销。
另外,我知道添加另一列is_empty_descr BOOLEAN
并为其添加索引的变体。如果找不到其他变种,我将使用此解决方案。
我尝试添加INDEX( descr(1) )
,但我找不到如何使用它的方式:
desrc <> ''
- 未使用索引LEFT(desrc, 1) = ''
- 未使用索引SUBSTR(desrc, 0, 1) = ''
- 未使用索引desrc LIKE 'a%'
- 使用了索引!但这是完全不同的情况在我的所有例子中,我都看到类似的东西:
mysql> EXPLAIN SELECT * FROM posts WHERE descr <> '';
+------+---------------+------+---------+------+------+-------------+
| type | possible_keys | key | key_len | ref | rows | Extra |
+------+---------------+------+---------+------+------+-------------+
| ALL | descr_1 | NULL | NULL | NULL | 42 | Using where |
+------+---------------+------+---------+------+------+-------------+
(我省略了一些结果列,因为该表对于此站点来说太宽了)
即使我通过FORCE index (descr_1)
,结果也会一样。
答案 0 :(得分:0)
在MySQL中,您可以使用以下语法在字符串的前缀上添加说明:
create index idx_posts_descr1 on posts(descr(1));
您应该对此进行测试,以查看该索引是否用于该特定where
子句。