SQL: что именно делают первичные ключи и индексы? - PullRequest
19 голосов
/ 22 августа 2009

Я недавно начал разрабатывать свое первое серьезное приложение, которое использует базу данных SQL, и я использую phpMyAdmin для настройки таблиц. Есть несколько необязательных «функций», которые я могу дать различным столбцам, и я не совсем уверен, что они делают:

  • Первичный ключ
  • Индекс

Я знаю, для чего нужен ПК и как его использовать, но я думаю, что мой вопрос по этому поводу - зачем он нужен - чем он отличается от простого задания столбца на «Уникальный», кроме факта? что у тебя может быть только один ПК? Это просто, чтобы сообщить программисту, что это значение однозначно идентифицирует запись? Или у него тоже есть какие-то особые свойства?

Я понятия не имею, что делает «Индекс» - фактически единственные случаи, когда я когда-либо видел его в использовании, это (1), что мои первичные ключи кажутся проиндексированными, и (2) я слышал, что индексация как-то связанные с производительностью; что вы хотите индексированные столбцы, но не слишком много. Как решить, какие столбцы индексировать, и что именно он делает?

edit: стоит ли указывать один столбец, который может потребоваться ORDER BY?

Большое спасибо,

Мало

Ответы [ 4 ]

27 голосов
/ 22 августа 2009

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

Например, если у вас есть таблица books с полем id, где id является первичным ключом и также установлен на auto_increment (в разделе «Дополнительно» в phpmyadmin), то при первом добавьте книгу в таблицу, идентификатор которой станет 1 '. Идентификатор следующей книги автоматически будет равен 2 и т. Д. Обычно в каждой таблице должен быть хотя бы один первичный ключ, помогающий легко идентифицировать и находить записи.

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

Однако есть и недостатки для добавления ненужных индексов, так что добавляйте это только к столбцам, к которым действительно требуется доступ больше, чем к другим. Например, запросы UPDATE, DELETE и INSERT будут немного медленнее, чем больше у вас индексов, так как MySQL должен хранить дополнительную информацию для каждого индексированного столбца. Более подробную информацию можно найти на этой странице .

Редактировать: Да, столбцы, которые нужно использовать в ORDER BY, должны иметь индексы, а также столбцы, используемые в WHERE.

7 голосов
/ 22 августа 2009

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

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

Индексы улучшают время поиска. Обычно они основаны на дереве, поэтому поиск определенной строки по индексу занимает время O (log (n)), а не сканирование всей таблицы.

Как правило, любой столбец большой таблицы, который часто используется в предложениях WHERE, ORDER BY или (особенно) JOIN, должен иметь индекс. Поскольку индекс должен быть обновлен для evey INSERT, UPDATE или DELETE, он замедляет эти операции. Если у вас мало записей и много прочтений, внесите в указатель содержание своего слуха. Если у вас есть как много записей, так и много запросов, которые требуют индексов для многих столбцов, то у вас есть большая проблема.

6 голосов
/ 22 августа 2009

Разницу между первичным ключом и уникальным ключом лучше всего объяснить на примере.

У нас есть таблица пользователей:

USER_ID number 
NAME varchar(30)
EMAIL varchar(50)

В этой таблице USER_ID является первичным ключом. ИМЯ не уникально - в мире много Джона Смита и Мухаммеда-хана. EMAIL обязательно уникален, иначе всемирная система электронной почты не будет работать. Поэтому мы накладываем уникальное ограничение на EMAIL.

Зачем тогда нам нужен отдельный первичный ключ? Три причины:

  1. числовая клавиша более эффективна при использовании во внешнем ключе отношения, поскольку это занимает меньше места
  2. электронная почта может измениться (например, обмен провайдера) но пользователь все тот же; рябь изменения значение первичного ключа по всей схеме это всегда кошмар
  3. это всегда плохая идея использовать конфиденциальная или конфиденциальная информация как внешний ключ
3 голосов
/ 22 августа 2009

В реляционной модели любой столбец или набор столбцов, которые гарантированно присутствуют и являются уникальными в таблице, можно назвать ключом-кандидатом в таблицу. «Настоящий» означает «НЕ НУЛЬ». При проектировании базы данных принято назначать один из ключей-кандидатов в качестве первичного ключа и использовать ссылки на первичный ключ для ссылки на всю строку или на предмет предмета, который описывает строка.

В SQL ограничение PRIMARY KEY равняется ограничению NOT NULL для каждого столбца первичного ключа и ограничению UNIQUE для всех столбцов первичного ключа, взятых вместе. На практике многие первичные ключи оказываются одиночными столбцами.

Для большинства продуктов СУБД ограничение PRIMARY KEY также приведет к автоматическому построению индекса по столбцам первичного ключа. Это ускоряет проверку системы при создании новых записей для первичного ключа, чтобы убедиться, что новое значение не дублирует существующее значение. Это также ускоряет поиск на основе значения первичного ключа и объединяет первичный ключ с внешним ключом, который на него ссылается. Степень ускорения зависит от того, как работает оптимизатор запросов.

Первоначально разработчики реляционных баз данных искали естественные ключи в данных как дано. В последние годы существует тенденция всегда создавать столбец с именем ID, целое число в качестве первого столбца и первичный ключ каждой таблицы. Функция автоматического создания СУБД используется для обеспечения уникальности этого ключа. Эта тенденция задокументирована в «Стандартах дизайна Осло». Это не обязательно реляционный дизайн, но он удовлетворяет некоторые насущные потребности людей, которые им следуют. Я не рекомендую эту практику, но я признаю, что это распространенная практика.

Индекс - это структура данных, которая обеспечивает быстрый доступ к нескольким строкам в таблице на основе описания столбцов таблицы, которые проиндексированы. Индекс состоит из копий определенных столбцов таблицы, называемых индексными ключами, с вкраплениями указателей на строки таблицы. Указатели обычно скрыты от пользователей СУБД. Индексы работают в тандеме с оптимизатором запросов. Пользователь указывает в SQL, какие данные запрашиваются, а оптимизатор предлагает стратегии индексирования и другие стратегии для преобразования искомого в состояние поиска. Существует некоторый организационный принцип, такой как сортировка или хеширование, который позволяет использовать индекс для быстрого поиска и некоторых других применений. Все это является внутренним для СУБД, когда создатель базы данных создал индекс или объявил первичный ключ.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...