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