2016-09-26 5 views
1

У меня есть таблица содержит данные 10M линииPostgres порядок комбинированного индекса

CREATE TABLE log_info 
(
    id serial NOT NULL, 
    created_date date, # date in month - max 30-31 distinct value 
    dept_id integer, # max 50 distinct value 
    group_id integer, # 10000 distinct value 
    ....... 
) 

Большинство запросов на основе CREATED_DATE, dept_id и GROUP_ID, поэтому я хочу, чтобы создать комбинированный индекс для 3-х полей

Я знаю, что порядок комбинированного индекса будет влиять на производительность базы данных, поэтому в моем случае, что является лучшим индексом?

CREATE INDEX log_info_index1 ON log_info USING btree (created_date, dept_id, group_id); 

или

CREATE INDEX log_info_index1 ON log_info USING btree (created_date, group_id, dept_id); 

ответ

1

Какой порядок лучше, зависит от того, какие запросы вы планируете работать. Рассмотрим следующие примеры:

WHERE created_date=? AND dept_id=? 
WHERE created_date=? AND dept_id>=? 
WHERE created_date=? AND dept_id=? AND group_id BETWEEN ? AND ? 

Для всех из них, индекс (created_date, dept_id, group_id) может быть использован, в то время как индекс (created_date, group_id, dept_id) не может. В общем, если у вас есть индекс по (a,b,c), то он может быть использован в следующих случаях

a=? 
a=? AND b=? 
a=? AND b=? AND c=? 
a=? AND {comparison involving b} 
a=? AND b=? AND {comparison involving c} 

где сравнение означает один из <, <=, between.

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

Так для примера, который сочетает в себе вышеупомянутые 2 правила, предположим, что у вас есть столбцы a, b и c. Предположим, что b может принимать только 5 различных значений (скажем, от 1 до 5), а a может принимать более 5 значений. Funally, предположим, что вы хотите только выполнить запрос с чем-то вроде

a=? AND b=? AND c>=? 

, то вы должны поставить c последний (из-за сравнения) и a перед тем b, потому что a имеет больше значения. Следовательно, вам нужно будет использовать следующий порядок: (a,b,c).

+0

Если a имеет 5 различных значений, b имеет 100 различных значений, c имеет 5000 различных значений и запрос a =? И b =? И c> = ?. Какой индекс наилучшего заказа? (a, b, c), (a, c, b), (c, b, a), .... –

+0

Тогда '(b, a, c)'. – redneb

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