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

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

3 ответов


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

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

недавно у нас была очень обстоятельная дискуссия об этом на dba.SE в этом связанном вопросе. С примерами, бенчмарками, обсуждением и прогнозом на предстоящую функцию сканирование в версии 9.2.

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

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


да:

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


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