Составной первичный ключ 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]

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