Когда я должен использовать первичный ключ или индекс? - PullRequest
41 голосов
/ 21 мая 2010

Когда мне следует использовать первичный ключ или индекс?

В чем их отличия и какие лучше?

Ответы [ 5 ]

26 голосов
/ 21 мая 2010

По сути, первичный ключ (на уровне реализации) - это особый вид индекса. В частности:

  • В таблице может быть только один первичный ключ, и, за очень немногими исключениями, в каждой таблице должен быть один.
  • Первичным ключом является неявно UNIQUE - вы не можете иметь более одной строки с одним и тем же первичным ключом, поскольку его целью является уникальная идентификация строк.
  • Первичный ключ никогда не может быть NULL, поэтому строки, из которых он состоит, должны быть NOT NULL

Таблица может иметь несколько индексов, и индексы не обязательно UNIQUE. Индексы существуют по двум причинам:

  • Для принудительного ограничения уникальности (они могут быть созданы неявно, когда вы объявляете столбец UNIQUE)
  • Для повышения производительности. Сравнения на равенство или «больше / меньше чем» в предложениях WHERE, а также в соединениях гораздо быстрее для столбцов, имеющих индекс. Но обратите внимание, что каждый индекс снижает производительность обновления / вставки / удаления, поэтому вы должны иметь их только там, где они действительно необходимы.
10 голосов
/ 21 мая 2010

Различия

Таблица может иметь только один первичный ключ , но несколько индексов .

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

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

Когда использовать то, что

Каждая таблица должна иметь первичный ключ . Определите первичный ключ, который гарантирует уникальную идентификацию каждой записи.

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

Что лучше?

Нет, на самом деле - у каждого есть своя цель. И дело не в том, что вы действительно можете выбрать одно или другое.

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

Добавление индексов по вашему личному опыту или, если производительность снижается. Измерьте разницу, и если вы работаете с SQL Server, научитесь читать планы выполнения.

6 голосов
/ 21 мая 2010

Ключи и индексы - это совершенно разные понятия, которые достигают разных целей. Ключ - это логическое ограничение, которое требует, чтобы кортежи были уникальными. Индекс - это функция оптимизации производительности базы данных, и, следовательно, физическая, а не логическая функция базы данных.

Различие между ними иногда размыто, потому что часто для определения ограничений и индексов используется сходный или идентичный синтаксис. Многие СУБД будут создавать индекс по умолчанию при создании ключевых ограничений. Вероятность путаницы между ключом и индексом вызывает сожаление, поскольку разделение логических и физических проблем является очень важным аспектом управления данными.

Что касается "первичных" ключей. Они не являются «специальным» типом ключа. Первичный ключ - это любой ключ-кандидат таблицы. Существует как минимум два способа создания ключей-кандидатов в большинстве СУБД SQL, и это либо с помощью ограничения PRIMARY KEY, либо с использованием ограничения UNIQUE для столбцов NOT NULL. Это очень распространенное соглашение, что каждая таблица SQL имеет ограничение PRIMARY KEY. Использование ограничения PRIMARY KEY является общепринятым и вполне разумным решением, но обычно оно не имеет практического или логического значения, поскольку большинство СУБД рассматривают все ключи как равные. Конечно, каждая таблица должна обеспечивать по крайней мере один ключ-кандидат, но не имеет значения, применяются ли эти ключи с помощью ограничений PRIMARY KEY или UNIQUE. В принципе важны ключи-кандидаты, а не «первичные» ключи.

6 голосов
/ 21 мая 2010

Это может помочь Назад к основам: разница между первичным ключом и уникальным индексом

Различия между ними:

  1. Столбецкоторые делают первичный ключ таблицы не может быть NULL, так как по определению первичный ключ не может быть NULL, поскольку он помогает однозначно идентифицировать запись в таблице.Столбцы, которые составляют уникальный индекс, могут иметь значение NULL.Здесь стоит упомянуть, что разные СУБД рассматривают это по-разному -> в то время как SQL Server и DB2 не допускают более одного значения NULL в столбце уникального индекса, Oracle допускает несколько значений NULL.Это одна из вещей, на которую следует обращать внимание при проектировании / разработке / портировании приложений в СУБД.
  2. В таблице может быть указан только один первичный ключ, так как вы можете иметь много уникальных индексов, определенных в таблице (при необходимости).
  3. Кроме того, в случае SQL Server, если вы используете параметры по умолчанию, тогда первичный ключ создается как кластеризованный индекс, а уникальный индекс (ограничение) создается как некластеризованный.индекс.Это просто поведение по умолчанию, и при необходимости его можно изменить во время создания.
4 голосов
/ 21 мая 2010

Первичный ключ по определению уникален : он идентифицирует каждую отдельную строку. Вам всегда нужен первичный ключ в вашей таблице, так как это единственный способ идентифицировать строки.

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

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

Например, если у вас есть индекс по столбцам (A, B, C), этот индекс можно использовать, даже если вы фильтруете только по A, потому что это первый столбец в индексе. Точно так же его можно использовать, если вы фильтруете по A и B. Однако его нельзя использовать, если вы фильтруете только по B или C, потому что они не являются префиксом в списке столбцов - вам нужен другой индекс, чтобы приспособиться к этому. .

Первичный ключ также служит индексом, поэтому вам не нужно добавлять индекс, объединяющий те же столбцы, что и ваш первичный ключ.

...