Составной первичный ключ 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 автоматически создает уникальный индекс, когда для таблицы определено уникальное ограничение или первичный ключ. Индекс охватывает столбцы, составляющие первичный ключ или уникальное ограничение (многоколоночный индекс, если это необходимо), и является механизмом, обеспечивающим выполнение ограничения.