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