В MySQL, когда я создаю составной первичный ключ, скажем, с столбцами X, Y, Z
, то все три столбца автоматически становятся индексами. То же самое происходит с Postgres?
Составной первичный ключ PostgreSQL
Ответ 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
Нет, вы получаете один индекс для первичного ключа с тремя столбцами.