Индекс базы данных - Database index

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

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

использование

Поддержка быстрого поиска

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

Предположим, что база данных содержит N элементов данных, и один из них должен быть извлечен на основе значения одного из полей. Простая реализация извлекает и исследует каждый элемент в соответствии с тестом. Если есть только один совпадающий элемент, это может остановиться, когда он найдет этот единственный элемент, но если есть несколько совпадений, он должен проверить все. Это означает, что количество операций в среднем случае равно О (Ни линейное время. Поскольку базы данных могут содержать много объектов, а поиск - обычная операция, часто бывает желательно повысить производительность.

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

Контроль ограничений базы данных

Индексы используются для полиции ограничения базы данных, например UNIQUE, EXCLUSION, ПЕРВИЧНЫЙ КЛЮЧ и ИНОСТРАННЫЙ КЛЮЧ. Индекс может быть объявлен как UNIQUE, что создает неявное ограничение для базовой таблицы. Системы баз данных обычно неявно создают индекс для набора столбцов, объявленных PRIMARY KEY, а некоторые из них могут использовать уже существующий индекс для контроля этого ограничения. Многие системы баз данных требуют, чтобы как ссылающиеся, так и ссылочные наборы столбцов в ограничении FOREIGN KEY индексировались, тем самым улучшая производительность вставок, обновлений и удалений в таблицах, участвующих в ограничении.

Некоторые системы баз данных поддерживают ограничение EXCLUSION, которое гарантирует, что для вновь вставленной или обновленной записи определенный предикат не выполняется ни для какой другой записи. Это можно использовать для реализации ограничения UNIQUE (с предикатом равенства) или более сложных ограничений, таких как обеспечение того, чтобы в таблице не сохранялись перекрывающиеся временные диапазоны или пересекающиеся геометрические объекты. Для контроля такого ограничения требуется индекс, поддерживающий быстрый поиск записей, удовлетворяющих предикату.[1]

Архитектура индекса и методы индексирования

Некластеризованный

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

В некластеризованном индексе

  • Физический порядок строк не совпадает с порядком индекса.
  • Индексированные столбцы обычно не являются столбцами первичного ключа, используемыми в предложениях JOIN, WHERE и ORDER BY.

В таблице базы данных может быть более одного некластеризованного индекса.

Кластеризованный

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

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

Кластер

Когда несколько баз данных и несколько таблиц объединяются, это называется кластер (не путать с описанным ранее кластерным индексом). Записи для таблиц, совместно использующих значение ключа кластера, должны храниться вместе в одних и тех же или соседних блоках данных. Это может улучшить объединение этих таблиц по ключу кластера, поскольку совпадающие записи хранятся вместе и для их поиска требуется меньше операций ввода-вывода.[2] Конфигурация кластера определяет структуру данных в таблицах, которые являются частью кластера. Кластер может иметь ключ B-дерево индекс или хеш-таблица. Блок данных, в котором хранится запись таблицы, определяется значением ключа кластера.

Порядок столбцов

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

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

В примере телефонной книги с сводный индекс создан на столбцах (город, фамилия, имя), если мы будем искать, задавая точные значения для всех трех полей, время поиска будет минимальным, но если мы предоставим значения для город и имя только поиск использует только город поле для получения всех совпавших записей. Затем последовательный поиск проверяет соответствие с имя. Таким образом, для повышения производительности необходимо убедиться, что индекс создается в порядке следования столбцов поиска.

Приложения и ограничения

Индексы полезны для многих приложений, но имеют некоторые ограничения. Рассмотрим следующее SQL утверждение: ВЫБЕРИТЕ first_name ИЗ людей, WHERE last_name = 'Smith';. Чтобы обработать этот оператор без индекса, программное обеспечение базы данных должно просматривать столбец last_name в каждой строке таблицы (это известно как полное сканирование таблицы ). При использовании индекса база данных просто следует структуре данных индекса (обычно B-дерево ) до тех пор, пока не будет найдена запись Смита; это намного дешевле в вычислительном отношении, чем полное сканирование таблицы.

Рассмотрим этот оператор SQL: ВЫБЕРИТЕ email_address ОТ клиентов, ГДЕ email_address КАК '%@wikipedia.org';. Этот запрос даст адрес электронной почты для каждого клиента, адрес электронной почты которого заканчивается на «@ wikipedia.org», но даже если столбец email_address был проиндексирован, база данных должна выполнить полное сканирование индекса. Это потому, что индекс построен с предположением, что слова идут слева направо. С подстановочный знак в начале поискового запроса программное обеспечение базы данных не может использовать базовую структуру данных индекса (другими словами, предложение WHERE нет сомнительный ). Эту проблему можно решить, добавив еще один индекс, созданный на обратный (email_address) и такой SQL-запрос: ВЫБЕРИТЕ email_address ОТ клиентов ГДЕ обратное (email_address) КАК обратное ('% @ wikipedia.org');. Это помещает подстановочный знак в самую правую часть запроса (теперь gro.aidepikiw@%), который может удовлетворить индекс на обратном (email_address).

Когда подстановочные знаки используются с обеих сторон поискового слова как % wikipedia.org%, индекс, доступный для этого поля, не используется. Вместо этого выполняется только последовательный поиск, который занимает время O (N).

Типы индексов

Индекс растрового изображения

Растровый индекс - это особый вид индексации, при котором большая часть данных хранится в виде битовые массивы (растровые изображения) и отвечает на большинство запросов, выполняя побитовые логические операции на этих растровых изображениях. Наиболее часто используемые индексы, такие как B + деревья, наиболее эффективны, если значения, которые они индексируют, не повторяются или повторяются небольшое количество раз. Напротив, растровый индекс разработан для случаев, когда значения переменной очень часто повторяются. Например, поле пола в базе данных клиентов обычно содержит не более трех различных значений: мужской, женский или неизвестный (не регистрируется). Для таких переменных индекс битовой карты может иметь значительное преимущество в производительности по сравнению с обычно используемыми деревьями.

Плотный индекс

Плотный индекс в базы данных это файл с парами ключей и указатели для каждого записывать в файле данных. Каждый ключ в этом файле связан с определенным указателем на запись в отсортированном файле данных. В кластеризованных индексах с повторяющимися ключами плотный индекс указывает к первой записи с этим ключом.[3]

Разреженный индекс

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

Обратный индекс

Индекс с обратным ключом меняет значение ключа на противоположное перед его вводом в индекс. Например, значение 24538 становится в индексе 83542. Изменение значения ключа на обратное особенно полезно для индексирования данных, таких как порядковые номера, где новые значения ключа монотонно увеличиваются.

Первичный индекс

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

Вторичный индекс

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

Реализации индекса

Индексы могут быть реализованы с использованием различных структур данных. Популярные индексы включают сбалансированные деревья, B + деревья и хеши.[4]

В Microsoft SQL Server, то листовой узел кластерного индекса соответствует фактическим данным, а не просто указателю на данные, которые находятся в другом месте, как в случае с некластеризованным индексом.[5] Каждое отношение может иметь один кластерный индекс и множество некластеризованных индексов.[6]

Контроль параллелизма индекса

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

Индекс покрытия

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

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

Рассмотрим следующую таблицу (другие поля опущены):

Я БЫИмяПрочие поля
12Затыкать...
13Напольная лампа...
14Предохранитель...

Чтобы найти Имя для ID 13, полезен индекс по (ID), но запись все равно должна быть прочитана, чтобы получить Имя. Однако индекс на (ID, Name) содержит необходимое поле данных и избавляет от необходимости искать запись.

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

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

Стандартизация

Ни один стандарт не определяет, как создавать индексы, потому что стандарт ISO SQL не охватывает физических аспектов. Индексы являются одной из физических частей концепции базы данных, например, хранилища (табличное пространство или файловые группы). Все поставщики СУБД предоставляют синтаксис CREATE INDEX с некоторыми конкретными параметрами, которые зависят от возможностей их программного обеспечения.

Смотрите также

Рекомендации

  1. ^ Документация PostgreSQL 9.1.2: СОЗДАТЬ ТАБЛИЦУ
  2. ^ Обзор кластеров Oracle® Database Concepts 10g, выпуск 1 (10.1)
  3. ^ Системы баз данных: полная книга. Эктор Гарсиа-Молина, Джеффри Д. Уллман, Дженнифер Д. Видом
  4. ^ Гэвин Пауэлл (2006). Глава 8: Построение быстродействующих моделей баз данных. Начало проектирования базы данных. Wrox Publishing. ISBN  978-0-7645-7490-0.
  5. ^ «Структуры кластеризованного индекса». Электронная документация по SQL Server 2005 (сентябрь 2007 г.).
  6. ^ Дарен Бениек; Рэнди Десс; Майк Хотек; Хавьер Лориа; Адам Маханик; Антонио Сото; Адольфо Верник (январь 2006 г.). «Глава 4: Создание индексов». Внедрение и управление SQL Server 2005. Microsoft Press.
  7. ^ Покрывающие индексы для оптимизации запросов