2009-08-22 3 views
17

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

  • первичного ключа индекса

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

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

    Редактировать: Следует ли указывать один номер столбца, который, возможно, захочет ЗАКАЗАТЬ?

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

    Мала

  • ответ

    25

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

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

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

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

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

    +2

    спасибо, вы были очень полезны! Мне было интересно, устанавливает ли столбец как ПК любое отличие от установки столбца как уникального Integer, который автоматически указывает на себя? Делает ли что-нибудь еще под капотом? – Mala

    +1

    Я отредактировал, чтобы ответить на ваш вопрос о недостатках индексов. Первичные ключи также функционируют как индексы, поэтому, когда у вас есть PK в столбце, все запросы для SELECT или ORDER BY на основе этого идентификатора будут быстрее. Кроме того, было бы гарантировано, что каждый «идентификатор» уникален, поэтому у вас не будет повторяющихся идентификаторов, например, у вас есть только столбец INT, который вы обновляете. –

    +3

    Первичный ключ не обязательно должен быть числовым или одним полем. и колонка IDENTITY лучше подходят для этого описания. Вместо этого первичный ключ служит для указания СУБД, что указанные поля могут однозначно идентифицировать одну строку в таблице. По сути, УНИКАЛЬНЫЙ ИНДЕКС. Нормальным (но не обязательным) для Первичных ключей также является контрольный фактор в том, какие данные хранятся (Clustered Primary Key в SQLServer) и поэтому значительно улучшают время, необходимое для поиска строк данных (для чтения, записи и т. Д.), – MatBailie

    7

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

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

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

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

    6

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

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

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

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

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

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

    В реляционной модели, любой столбец или набор столбцов, которые гарантированы как присутствующие, так и уникальные в таблице, можно назвать ключом-кандидатом к таблице. «Present» означает «NOT NULL». В дизайне базы данных обычно используется назначение одного из ключей-кандидатов в качестве первичного ключа и использование ссылок на первичный ключ для ссылки на всю строку или на предмет предмета, который описывает строка.

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

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

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

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

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

    +0

    (если вы все еще рядом) = Мне любопытно, почему вы не рекомендуем настраивать целочисленный столбец в качестве первичного ключа. Я сделал это обычной практикой в ​​моей разработке SQL и обнаружил, что он делает выборки, обновления, вставки и удаления из PHP-скриптов (а также установление связей между таблицами и создание объединений) гораздо проще, чем полагаться на натуральные ПК, полученные из данные. – Vega

    +0

    Это спорный вопрос, так как мой взгляд является видом меньшинства. –