2010-02-16 2 views
0

я ожидал, либо индекс будет использоваться для моего запроса SELECT DISTINCT ниже:Почему мой индекс не используется для этого запроса 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, для RedHat -linux-gnu (i686) с использованием readline 5.1. Этот тип запросов занимает 1,5 с на 70 000 строк с 250 отличными значениями против примерно 10 мс в одной таблице для индексированных целых столбцов.

ответ

1

выписка http://dev.mysql.com/doc/refman/5.1/en/fulltext-fine-tuning.html

Минимальные и максимальные длины слов, которые будут индексироваться определяются ft_min_word_len и ft_max_word_len системных переменных. Минимальная длина по умолчанию - 3. В вашем примере все записи имеют длину 1 символ.

+0

У меня было значение ft_min_word_len равным 4, но изменение его на 1 и восстановление таблиц не имеет никакого значения. –

+0

жаль, что это не помогло. – t00ny

0

Если оптимизатор определяет, что быстрее использовать индекс не будет. Вы уверены, что индекс был заполнен к моменту запуска запроса?

Попробуйте вставить это перед запросом:

RUNSTATS ON TABLE test 
2

ли это сделать для полностью заселенной таблицы, а?

В моем опыте (по крайней мере, с MS SQL) оптимизатор знает, когда таблица крошечная (как ваш маленький пример), и знает, что загрузка индекса будет расточительной и просто загружает всю таблицу.

+0

Действительно; Я отредактировал текст вопроса, чтобы решить эту проблему. –

Смежные вопросы