2013-07-04 6 views
6

У меня есть таблица PostgreSQL с 2 индексами. Один из индексов охватывает столбцы website_id и tweet_id и является уникальным индексом B-дерева. Второй индекс охватывает только столбец website_id и является уникальным индексом.2 Индексы PostgreSQL в одном столбце одной таблицы - избыточные?

Является ли второй индекс избыточным, если существует первый индекс? Другими словами, не будет ли преимуществ наличия второго индекса?

+1

Вы не указали тип второго индекса. Фактически, вам нужно будет опубликовать определение таблицы, включая соответствующие столбцы и определения индексов, чтобы получить окончательный ответ - используйте '\ d tbl' в psql. –

ответ

9

postgres многоколоночные индексы могут использоваться для поиска только по первым столбцам, поэтому на практике это избыточно.

Многоколоночный индекс B-дерева может использоваться с условиями запроса, которые включают в себя любое подмножество столбцов индекса, но индекс наиболее эффективен, когда существуют ограничения на ведущие (крайние слева) столбцы. Точное правило заключается в том, что ограничения ограничения для ведущих столбцов плюс любые ограничения неравенства в первом столбце, которые не имеют ограничения равенства, будут использоваться для ограничения части проверяемого индекса.

Postgres 9.2 documentation

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

https://dba.stackexchange.com/questions/27481/is-a-composite-index-also-good-for-queries-on-the-first-field/27493#27493

1

Да, это (резервный).

Составное поведение индекса распространено не только для Postgres, но и для большинства других СУБД.

+1

В этом случае да, это избыточно. Но важным моментом является то, что если вопрос задает вопрос о том, является ли другой индекс в 'tweet_id' избыточным, ответ будет не основан на многоколоночном индексировании. –

+0

хорошо в соответствии с этим инструкцией по установке postgresql, написанной вручную, и, по-видимому, несколько избыточным для tweet_id, но менее эффективным. –

+0

и mysql, возможно, просто сделают харакири, если вы попробуете это. –

5

Это зависит.

Предполагая, что мы говорим только о индексах по умолчанию B-Tree. Если задействованы другие типы индексов, такие как GIN или GiST, все не так просто.

В принципе, индекс на (a,b) полезен для поиска только a, а другой индекс только (a) не нужен. (But an additional index on just (b) generally makes sense!)
Это may все еще будет хорошей идеей, если столбец b большой, так что индекс только (a) существенно меньше.

Вам необходимо будет рассмотреть размер таблицы, доступную оперативную память, типичные запросы, используемые типы данных, размер индекса, накладные расходы на каждый кортеж и размер данных, data alignment and padding ... или просто запустить тесты с помощью фактические данные и запросы (но осторожно, что вы действительно тестируете).

Например, если a и b не являются больше чем 4 байта (integer, smallint, date, ...) индекс на (a,b) точно так, как большой, как и на просто (a) и нет никакого смысла вообще держать второй.

A more detailed answer on dba.SE for this case exactly.

manual for the current version of Postgres всегда является хорошим источником для получения более подробной информации.

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