Вопрос по composite-primary-key, postgresql, indexing – Составной первичный ключ PostgreSQL

28

В MySQL, когда я создаю составной первичный ключ, скажем, с колонкамиX, Y, Zзатем все три столбца автоматически становятся индексами. То же самое происходит с Postgres?

Вы имеете в виду, что MySQL создаетthree indexes? Звучит ужасно странно a_horse_with_no_name

Ваш Ответ

3   ответа
65

Если вы создаете составной первичный ключ, на(x, y, z)PostgreSQL реализует это с помощью одногоUNIQUE многостолбцовый индекс btree on(x, y, z), Кроме того, все три столбца должны бытьNOT NULLКонечно, что является основным отличиемPRIMARY KEY иUNIQUE INDEX.

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

У нас была очень тщательная дискуссия об этом недавнона dba.SE в этом связанном вопросе, С примерами, контрольными показателями, обсуждением и перспективой будущей функцииindex-only scans in version 9.2.

В частности, первичный ключ на(x, y, z) ускорит запросы с условиями наx, (x,y) или же(x,y,z) оптимально. Это также поможет с вопросами наy, z, (y,z) или же(x,z) но в гораздо меньшей степени.

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

2

да:

PostgreSQL automatically creates a unique index when a unique constraint or primary key is defined for a table. The index covers the columns that make up the primary key or unique constraint (a multicolumn index, if appropriate), and is the mechanism that enforces the constraint.

Согласен. Вопрос не в том, автоматически ли создается 1 многоколонный индекс, а в том, чтобы создать 3 одноколоночных индекса. И ответ нет. Ваш ответ по-прежнему актуален, поскольку он предоставляет дополнительную информацию, после того, как он был отредактирован. На самом деле, ответ @ dondi-michael-stroma более актуален, чем тот, который был выбран первоначальным запросчиком.
Я думаю, что вопрос заключался в том, получает ли каждый столбец свой собственный индекс.
1

Нет, вы получаете один индекс для первичного ключа с тремя столбцами.

Похожие вопросы