Индекс базы данных

редактировать
Структура данных для оптимизации запросов в базах данных

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

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

Содержание

  • 1 Использование
    • 1.1 Поддержка быстрого поиска
    • 1.2 Контроль ограничений базы данных
  • 2 Архитектура индекса и методы индексирования
    • 2.1 Некластеризованный
    • 2.2 Кластерный
    • 2.3 Кластер
  • 3 Порядок столбцов
  • 4 Приложения и ограничения
  • 5 Типы индексов
    • 5.1 Битовый индекс
    • 5.2 Плотный индекс
    • 5.3 Разреженный индекс
    • 5.4 Обратный индекс
    • 5.5 Первичный index
    • 5.6 Вторичный индекс
  • 6 Реализации индекса
    • 6.1 Управление параллелизмом индекса
  • 7 Покрывающий индекс
  • 8 Стандартизация
  • 9 См. также
  • 10 Ссылки

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

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

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

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

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

Применение политик для ограничений базы данных

Индексы используются для контроля ограничений базы данных, таких как UNIQUE, EXCLUSION, PRIMARY KEY и FOREIGN KEY. Индекс может быть объявлен как UNIQUE, что создает неявное ограничение для базовой таблицы. Системы баз данных обычно неявно создают индекс для набора столбцов, объявленных PRIMARY KEY, а некоторые из них могут использовать уже существующий индекс для контроля этого ограничения. Многие системы баз данных требуют, чтобы как ссылающиеся, так и ссылочные наборы столбцов в ограничении FOREIGN KEY индексировались, тем самым улучшая производительность вставок, обновлений и удалений в таблицы, участвующие в ограничении.

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

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

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

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

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

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

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

Кластеризация

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

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

Кластер

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

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

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

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

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

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

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

Рассмотрим этот оператор SQL: ВЫБРАТЬ email_address ОТ клиентов ГДЕ email_address LIKE '%@wikipedia.org';. Этот запрос даст адрес электронной почты для каждого клиента, адрес электронной почты которого заканчивается на «@ wikipedia.org», но даже если столбец email_address был проиндексирован, база данных должна выполнить полное сканирование индекса. Это потому, что индекс построен с предположением, что слова идут слева направо. С подстановочным знаком в начале поискового запроса программное обеспечение базы данных не может использовать базовую структуру данных индекса (другими словами, предложение WHERE не является sargable ). Эта проблема может быть решена путем добавления другого индекса, созданного на reverse (email_address), и SQL-запроса, подобного этому: SELECT email_address FROM customers WHERE reverse (email_address) LIKE reverse ('% @ wikipedia. org ');. Это помещает подстановочный знак в самую правую часть запроса (теперь [email#160;protected] %), который может удовлетворить индекс на обратном (email_address).

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

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

Индекс битовой карты

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Управление параллелизмом индексов

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

Покрывающий индекс

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

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

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

IDИмяДругие поля
12Plug...
13Лампа...
14Предохранитель...

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

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

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

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

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

См. Также

Ссылки

Последняя правка сделана 2021-05-17 14:11:59
Содержание доступно по лицензии CC BY-SA 3.0 (если не указано иное).
Обратная связь: support@alphapedia.ru
Соглашение
О проекте