SQL:что именно делают первичные ключи и индексы?

StackOverflow https://stackoverflow.com/questions/1315481

  •  19-09-2019
  •  | 
  •  

Вопрос

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

  • Первичный ключ
  • Указатель

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

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

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

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

Mala

Это было полезно?

Решение

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

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

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

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

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

Другие советы

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top