Составной первичный ключ PostgreSQL
20 user1467855 [2012-07-05 23:25:00]
В MySQL, когда я создаю составной первичный ключ, скажем, с столбцами X, Y, Z
, то все три столбца автоматически становятся индексами. То же самое происходит с Postgres?
indexing postgresql composite-primary-key
3 ответа
49 Решение Erwin Brandstetter [2012-07-06 00:03:00]
Если вы создаете составной первичный ключ, на (x, y, z)
, PostgreSQL реализует это с помощью одного UNIQUE многоколоночного индекса на (x, y, z)
. Кроме того, все три столбца должны быть NOT NULL
, конечно, что является основным отличием между a PRIMARY KEY
и a UNIQUE INDEX
.
Помимо очевидных ограничений на ваши данные, многоколоночный индекс также оказывает несколько иное влияние на производительность запросов, чем три отдельных индекса на x
, y
и z
.
Мы очень подробно обсудили этот недавно на dba.SE в этом связанном вопросе. В примерах, тестах, обсуждениях и перспективах предстоящей функции индексирования только в версии 9.2.
В частности, первичный ключ на (x, y, z)
будет ускорять запросы с условиями на x
, (x,y)
или (x,y,z)
оптимально. Это также поможет с запросами на y
, z
, (y,z)
или (x,z)
, но в гораздо меньшей степени.
Если вам нужно ускорить запросы по последним комбинациям, вы можете создать один или несколько дополнительных индексов.
1 Milen A. Radev [2012-07-05 23:42:00]
Да:
PostgreSQL автоматически создает уникальный индекс, когда для таблицы определено уникальное ограничение или первичный ключ. Индекс охватывает столбцы, которые составляют первичный ключ или уникальное ограничение (в случае необходимости - многоколоночный индекс) и является механизмом, обеспечивающим ограничение.
1 Dondi Michael Stroma [2012-07-05 23:54:00]
Нет, вы получаете один индекс для первичного ключа с тремя столбцами.