用于非空字符串查询的MySQL索引

时间:2015-02-26 11:54:17

标签: mysql indexing

我的应用程序中有表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),结果也会一样。

1 个答案:

答案 0 :(得分:0)

在MySQL中,您可以使用以下语法在字符串的前缀上添加说明:

create index idx_posts_descr1 on posts(descr(1));

您应该对此进行测试,以查看该索引是否用于该特定where子句。