Составной первичный ключ PostgreSQL

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

Ответ 1

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

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

Связанное обсуждение на dba.SE:

С примерами, тестами, обсуждением и обзором новой функции сканирования только по индексу в Postgres 9.2.

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

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

Ответ 2

Да:

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

Ответ 3

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