Почему мой индекс не используется для этого запроса SELECT DISTINCT в текстовом столбце? - PullRequest
0 голосов
/ 16 февраля 2010

Я ожидал, что любой из этих индексов будет использоваться для моего запроса 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 мс в той же таблице для индексированных целочисленных столбцов.

Ответы [ 3 ]

2 голосов
/ 16 февраля 2010

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

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

1 голос
/ 16 февраля 2010

проверить http://dev.mysql.com/doc/refman/5.1/en/fulltext-fine-tuning.html

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

0 голосов
/ 16 февраля 2010

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

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

RUNSTATS ON TABLE test
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...