Правильный порядок столбцов для создания индекса в Postgres - PullRequest
1 голос
/ 19 апреля 2019

Рассмотрим таблицу Address с двумя столбцами text, City и State. Я буду реализовывать следующий запрос:

select * from address where city = $1 and state = $2;

Для поиска по индексу я создам индекс:

create index address_city_state on address(city,state);

Вопрос в том, порядок, в котором столбцы установлены при создании индекса, первый город, а не штат, влияет на производительность запроса или каким-либо иным образом, учитывая, что значения города будут отличаться в большей степени, чем значения штатов?

Ответы [ 2 ]

1 голос
/ 19 апреля 2019

Для этого запроса:

where city = $1 and state = $2

Не имеет значения, какой ключ идет первым.Оба ключа будут использоваться для поиска (с помощью поиска по индексу) конкретной строки.

Если city / state , то всегда будут использоваться вместе, а всегда с =, тогда я, вероятно, сначала поставлю state, а затем city, потому что это следует географической иерархии.Однако я не думаю, что есть какое-либо преимущество в производительности.

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

Порядок ключей имеет значение, когда нетвсе ключи имеют = сравнений в предложении where.Похоже, что это не так.

0 голосов
/ 19 апреля 2019

Как правило, вы хотите поместить в индекс более ограничительный столбец.То есть, если бы city имел большую мощность, чем state, вы бы использовали (city, state).Причина этого в том, что теоретически он позволил бы Postgres отфильтровать многие несущественные записи в первую очередь, прежде чем даже попасть во второй столбец индекса.

Но в вашем запросе есть проблема.Вы делаете select *, и это означает, что, скорее всего, ваш индекс должен будет охватывать все столбцы в предложении select, чтобы Postgres решил использовать его.Если ваша таблица address имеет, например, только два других столбца, то вы можете использовать этот индекс:

(city, state, col1, col2)

Указанный выше индекс называется охватывает третий и четвертый столбцыcol1 и col2, поскольку это означает, что индекс сам по себе содержит всю информацию, необходимую для выполнения исходного запроса.Если вы попробуете select *, а в вашей таблице будет много других столбцов, Postgres может не использовать предложенный вами индекс.

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