Индексирование базы данных

12

Я не очень знаком с базами данных, и теперь я пытаюсь понять механизм индексации.

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

Я не уверен насчет СУБД, но в тройных хранилищах вы можете определить более одного индекса, позволяя магазину выбирать лучший индекс для каждого запроса (надеюсь, я правильно понял). Естественно, возникает следующий вопрос:

Почему бы мне не добавить все возможные индексы в тройное хранилище и не распространяться на СУБД, почему бы не создавать индексы для каждого столбца (если я не слишком ленив)?

Dragos
источник

Ответы:

25

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

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

Обратите внимание, что с составными, кластерными и полнотекстовыми индексами это становится еще хуже, но я пока не хочу усложнять проблему для вас.

прецизионный самописец
источник
2

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

Зачем вам создавать и хранить индексы, которые вы никогда не используете?

Матей Забский
источник
Это чисто теоретический вопрос («что если / почему нет»).
Драгос
@ Dragos Я думаю, что ответ на этот вопрос очевиден из моего поста: если бы вы это сделали, каждая операция записи была бы намного медленнее, а каждая запись тратит много дискового пространства. Почему нет? Потому что мощность процессора и дискового пространства стоят дорого.
Матей Забский
2

Размещайте индексы только при необходимости. Как правило, при разработке схемы базы данных каждая таблица получает кластерный индекс первичного ключа PK для начала. Это будет уникальный идентификатор данных в этой таблице. В может быть по 1 столбцу или много.

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

Это базовая схема. По мере развития и совершенствования приложения мы добавляем индексы по мере необходимости, исходя из проблем производительности и того, как мы запрашиваем данные.

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

Джон Рейнор
источник
При чтении вашего ответа мне в голову пришёл другой вопрос: первичные ключи обычно индексируются автоматически, или я должен сам указать, что они будут проиндексированы? Скажем, например, в базе данных MySQL?
Драгос
Да, первичный ключ должен автоматически создавать кластерный индекс для вашего (SQL Server). Только один первичный ключ, то есть только один кластерный индекс на таблицу. MySQL должен быть похожим, но, возможно, эксперт MySQL может проверить.
Джон Рейнор
2

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

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

Кроме того, индексы для одного столбца - даже не лучшее, что вы можете сделать. Большинство реляционных баз данных фактически позволяют индексировать несколько столбцов, и порядок этих столбцов имеет значение. Например, если я хочу найти в базе данных всех людей, которые ходили в Duke с уроков в период с 1980 по 1984 год, то мне нужен индекс (School, ClassYear). Запрос не сможет использовать индекс с такими же столбцами, но обратный.

Таким образом, чтобы создать все возможные индексы, существует не менее n! способы размещения столбцов в индексе. Имея только 5 столбцов, существует 120 возможных индексов.

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

Крис Питман
источник
Но будут ли в вашем примере два индекса: один для школы и другой для ClassYear пригодиться в любом случае?
Драгос
@Dragos Конечно, они могут быть. Если бы у меня был другой запрос, который был только в течение учебного года (все ученики, которые пошли в школу в классе 2004 года), тогда индекс Классного года может быть полезен. К сожалению, существует множество факторов, которые механизм запросов использует при принятии решения, когда и какой индекс использовать. Если выяснится , что половина людей в базе данных были идти в школу в 2004 году, то база данных может просто игнорировать индекс и сканирование по всей таблице в любом случае. Если вы хотите преуспеть в этом, начните использовать и читать планы выполнения
Крис Питман
Я имел в виду следующее: если у меня есть отдельные индексы для School и ClssYear, будут ли они полезны при поиске всех людей, которые ходили в Duke с уроков между 1980 и 1984 годами?
Драгос
@Dragos Это зависит от конкретного движка БД. Например, Postgres будет использовать так называемое сканирование индекса растрового изображения , чтобы пересечь результаты нескольких индексов. Решать, какой индекс использовать, зависит от механизма запросов, который всегда будет зависеть от БД.
Крис Питман
2

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

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

FrustratedWithFormsDesigner
источник