代码之家  ›  专栏  ›  技术社区  ›  Dickon Reed

为什么我的索引不用于文本列上的此select distinct查询?

  •  0
  • Dickon Reed  · 技术社区  · 14 年前

    我希望在下面的select distinct查询中使用其中一个索引:

    CREATE TABLE test(
      value TEXT
    );
    
    INSERT INTO test (value) VALUES ('a');
    INSERT INTO test (value) VALUES ('b');
    INSERT INTO test (value) VALUES ('c');
    
    CREATE INDEX value_i ON test(value(32));
    CREATE FULLTEXT INDEX value_i_ft ON test(value);
    
    SELECT DISTINCT value FROM test;
    
    EXPLAIN SELECT DISTINCT value FROM test;
    

    然而,似乎不是:

    --------------
    EXPLAIN SELECT DISTINCT value FROM test
    --------------
    
    +----+-------------+-------+------+---------------+------+---------+------+------+-----------------+
    | id | select_type | table | type | possible_keys | key  | key_len | ref  | rows | Extra           |
    +----+-------------+-------+------+---------------+------+---------+------+------+-----------------+
    |  1 | SIMPLE      | test  | ALL  | NULL          | NULL | NULL    | NULL |    2 | Using temporary |
    +----+-------------+-------+------+---------------+------+---------+------+------+-----------------+
    1 row in set (0.00 sec)
    

    我使用的是MySQLver14.12distrib 5.0.77,用于RedhatLinuxGNU(i686),使用的是readline 5.1。这种查询在70000行上取1.5秒,其中有250个不同的值,而在索引整数列的同一个表上取约10毫秒。

    3 回复  |  直到 14 年前
        1
  •  1
  •   t00ny    14 年前

    退房 http://dev.mysql.com/doc/refman/5.1/en/fulltext-fine-tuning.html

    要索引的词的最小和最大长度由ft_min_word_len和ft_max_word_len系统变量定义。默认最小长度为3。在您的示例中,所有记录都是1个字符长。

        2
  •  2
  •   BradC    14 年前

    它是否也为完全填充的表执行此操作?

    在我的经验中(至少在MS SQL中),优化器知道表是小的(就像您的小例子),并且知道加载索引是浪费的,并且只加载整个表。

        3
  •  0
  •   Nick Craver    14 年前

    如果优化器确定不使用索引更快,则不会。是否确定索引已由运行查询时填充?

    尝试在查询前插入此项:

    RUNSTATS ON TABLE test