Индексирование влияет только на предложение WHERE? - PullRequest
3 голосов
/ 05 января 2011

Если у меня есть что-то вроде:

CREATE INDEX   idx_myTable_field_x
ON             myTable
USING          btree (field_x);

SELECT COUNT(field_x), field_x FROM myTable GROUP BY field_x ORDER BY field_x;

Представьте себе myTable с примерно 500,000 rows и большинством значений field_x, которые являются уникальными.

Поскольку я не использую какое-либо предложение WHERE, будет ли созданный индекс иметь какой-либо эффект в моем запросе?

Редактировать : я задаю этот вопрос, потому что я не вижу существенной разницы между временем запроса до и после создания индекса;Они всегда занимают около 8 секунд (что, конечно, слишком много времени!).Ожидается ли такое поведение?

Ответы [ 3 ]

6 голосов
/ 05 января 2011

Индекс здесь не поможет, так как вы читаете всю таблицу в любом случае, сначала нет смысла переходить к индексу (PostgreSQL еще не имеет сканирования только по индексу)Индекс уникален, он не очень поможет в этой ситуации.Поиск по индексу (включая сканирование по индексу для других СУБД), как правило, очень полезен для поиска небольшого числа строк.

Существует небольшая вероятность того, что индекс может быть использован для упорядочения, но я сомневаюсь в этом.

Если вы посмотрите на вывод EXPLAIN ANALYZE VERBOSE, вы увидите, выполняется ли сортировка в памяти или (из-за размера результата) выполняется на диске.

Если сортировка выполняется на диске, вы можете ускорить запрос, увеличив значение work_mem - либо глобально, либо только для вашего сеанса.

3 голосов
/ 05 января 2011

Поскольку field_x является единственным столбцом, на который ссылается ваш запрос, ваш индекс охватывает запрос и должен помочь вам избежать поиска в реальных строках myTable.

РЕДАКТИРОВАТЬ : Как указано в комментариях ниже, хотя этот ответ действителен для большинства реализаций СУБД, он не применяется к postgresql.

2 голосов
/ 05 января 2011

Индекс должен быть использован.Если вы когда-нибудь захотите увидеть, как используются ваши индексы (или нет), план выполнения запроса - отличное место, чтобы увидеть, что база данных решила сделать.В вашем случае вы должны выполнить что-то вроде:

explain SELECT COUNT(field_x), field_x FROM myTable GROUP BY field_x ORDER BY field_x;

Более подробную информацию о том, что означает весь вывод, который вы видите, можно найти в документации postgres: http://www.postgresql.org/docs/8.4/static/sql-explain.html

Также есть:http://wiki.postgresql.org/wiki/Image:Explaining_EXPLAIN.pdf, что немного глубже.

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