为什么我的索引不用于文本列上的SELECT DISTINCT查询?

时间:2010-02-16 15:45:13

标签: sql mysql database indexing

我希望下面的索引能用于我的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)

我正在使用mysql Ver 14.12 Distrib 5.0.77,对于使用readline 5.1的redhat-linux-gnu(i686)。这种查询在70,000行上具有1.5秒,具有250个不同的值,而对于索引整数列,在同一表上约为10ms。

3 个答案:

答案 0 :(得分:2)

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

根据我的经验(至少使用MS SQL),优化器知道表何时很小(就像你的小例子),并且知道加载索引会浪费,只是加载整个表。

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

如果优化器确定不使用索引更快,则不会。您确定在运行查询时填充了索引吗?

尝试在查询之前插入此内容:

RUNSTATS ON TABLE test