Индексы базы данных: Что такое индексы базы данных (для начинающих)? — IM-Cloud.ru

Содержание

Что такое индексы базы данных (для начинающих)? — IM-Cloud.ru

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

 

Что такое индекс базы данных и зачем он нужен?

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

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

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

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

Теперь, представьте себе, что речь идет не об одной полочке, а об огромном помещении, где находятся тысячи книг.

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

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

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

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

Так вот, в данном примере, если переносить это в базу данных:

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

Поиск книги — это sql-запросы получения данных

. При этом важно отметить, что сами по себе они не меняются. То есть вам как нужно было найти «Термодинамику», так и осталось нужным найти «Термодинамику». Другое дело, как вы будете это осуществлять — прочесывая тысячи книг или открыв каталог.

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

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

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

Так же можно заметить, что добавление индекса не требует того, чтобы сами sql-запросы были переписаны, так как последние являются лишь выражением на упрощенном языке для базы данных. Если продолжить аналогию, то это как попросить кого-то найти вам «Флора и фауна». При этом каким образом и сколько этот кто-то будет искать книгу, будет решать сам этот человек. В данном примере «найти книгу» — это sql-запрос, а этот «кто-то» это база данных.

 

Какие бывают индексы?

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

Немного поясню.

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

Как видите, очень похоже на перевернутое обычное зеленое дерево, у которого ветки растут не вверх, а вниз.

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

Теперь поясню откуда берется логарифм. Дело в том, что дерево обычно заполняется по определенным правилам. К примеру, если у узла максимально может быть всего два дочерних узла (так называемое бинарное дерево), то обычно левый дочерний узел имеет значение меньше текущего, а правый большее значение. Поэтому если вам нужно найти, например, число 30 в дереве с рисунка чуть выше, то вам понадобится всего 4 сравнения (40 — 25 — 32 — 30). Именно из-за этой особенности поиска и берется логарифм (так как каждое сравнение сокращает количество проверяемых элементов в два раза). При этом обычно значение логарифма округляют в большую сторону.

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

Как видите, чтобы здесь найти запись с ключом «3» понадобится 4 сравнения (40 — 25 — 10 — 3), хотя всего записей 5.

Практически во всех базах данных, существует деление по уникальности:

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

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

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

Так же стоит знать, что индексы делятся по количеству входящих в них полей:

Обычные индексы — состоят из одного поля. Здесь, вероятно, все понятно. Обычный каталог страничек.

Составные индексы — строятся по нескольким полям, при этом расположение полей является важным.

Чуть подробнее про составные индексы. Рассмотрим аналогию с теми же книгами. До этого индекс строился только по названию. Теперь же представим, что книги с одинаковыми названиями часто встречаются. В такой ситуации, легко может получится, что страничка каталога будет состоять из координат сотен книг (десятки авторов и у каждого по десять копий). Бегать их всех проверять — так же немалое количество времени. Поэтому вместо того, чтобы страничка просто перечисляла все местонахождения книг, можно сделать так, чтобы странички с именами книг указывали на дополнительные каталоги, где аналогичным образом проиндексированы авторы.

Немного упрощая, поиск будет выглядит примерно так.

1. Вначале вы ищите в каталоге с именами необходимую страничку с названием.

2. Затем в этой страничке смотрите, где находится соответствующий каталог с авторами.

3. Берете этот каталог и уже в нем находите страничку, где указано месторасположение всех книг с этим автором и названием.

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

Существуют и другие моменты, но чаще всего достаточно знать хотя бы эти базовые знания.

 

«Добавим 2 млн статей и посмотрим, что будет»: как ускорить базу данных с помощью индексов

Что происходит, когда мы запрашиваем данные? А что вы делаете, когда ищете нужную вам строку в таблице? Да, база данных сканирует всю таблицу и выбирает те записи, которые попадают под условия.

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

Индекс, который мы создали, представляет из себя такую структуру данных, как B-дерево. Но, например, в InnoDB используется B+-дерево. Всё зависит от подсистемы хранения, а в целом принцип их работы похож. Это дерево строится по колонке views из таблицы articles.

Чтобы понять, как происходит выборка с индексом, нужно знать, как работает B-дерево.

Перед нами B-дерево индекса. В каждом узле хранятся элементы со значениями; в нашем случае это значения из поля

views. Также элементы хранят ссылку на строку в таблице.

Поиск начинается с корневого узла. Наша задача — пройти по каждому элементу в узле и сравнить его значение с искомым:

  • Если значение совпало — берём ссылку на данные и читаем их из таблицы.
  • Если наше значение больше, чем значение в элементе, — идём дальше.
  • Если искомое значение меньше, чем в элементе, — нам нужно перейти в поддерево, которое хранится левее от ячейки. Далее мы попадаем на следующий уровень и итерация повторяется.

Рассмотрим алгоритм на примере поиска значения 2001.

  • Как и говорилось ранее, мы начинаем с корневого узла — первой ячейки со значением 1000.
  • Так как 2001 больше 1000, то мы идём дальше.
  • Доходим до ячейки 3000. Но 2001 меньше, чем 3000, поэтому переходим на поддерево.
  • Первая ячейка идёт со значением 2200, наше значение меньше, значит снова переходим на левое поддерево.
  • И сразу же находим ячейку со значением 2001.

То, что мы и искали. А так как искомая ячейка содержит ссылку на место, где лежат наши данные, то мы можем легко и быстро прочитать их.

Transact-SQL | Индексы

172

Работа с базами данных в .NET Framework — SQL Server 2012 — Индексы

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

В этой статье рассматриваются индексы и их роль в оптимизации времени выполнения запросов. В первой части статьи обсуждаются разные формы индексов и способы их хранения. Далее исследуются три основные инструкции языка Transact-SQL, применяемые для работы с индексами: CREATE INDEX, ALTER INDEX и DROP INDEX. Потом рассматривается фрагментация индексов ее влияния на производительность системы. После этого дается несколько общих рекомендаций по созданию индексов и описывается несколько специальных типов индексов.

Общие сведения

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

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

Но между индексом книги и индексом базы данных есть две существенные разницы:

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

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

Если для таблицы отсутствует подходящий индекс, для выборки строк система использует метод сканирования таблицы. Выражение сканирование таблицы означает, что система последовательно извлекает и исследует каждую строку таблицы (от первой до последней), и помещает строку в результирующий набор, если для нее удовлетворяется условие поиска в предложении WHERE. Таким образом, все строки извлекаются в соответствии с их физическим расположением в памяти. Этот метод менее эффективен, чем доступ с использованием индексов, как объясняется далее.

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

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

Индексы компонента Database Engine создаются, используя структуру данных сбалансированного дерева B+. B+-дерево имеет древовидную структуру, в которой все самые нижние узлы находятся на расстоянии одинакового количества уровней от вершины (корневого узла) дерева. Это свойство поддерживается даже тогда, когда в индексированный столбец добавляются или удаляются данные.

На рисунке ниже показана структура B+-дерева для таблицы Employee и прямой доступ к строке в этой таблице со значением 25348 для столбца Id. (Предполагается, что таблица Employee проиндексирована по столбцу Id.) На этом рисунке можно также видеть, что B+-дерево состоит из корневого узла, узлов дерева и проме

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

Что такое индексирование?

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

Индекс —

  • Принимает ключ поиска в качестве ввода
  • Эффективно возвращает коллекцию совпадающих записей.

Из этого руководства по индексированию СУБД вы узнаете:

Типы индексации

Тип индексов

Индексация базы данных определяется на основе ее атрибутов индексации. Два основных типа методов индексации:

  • Первичная индексация
  • Вторичная индексация

Первичная индексация

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

Первичная индексация также делится на два типа.

  • Плотный индекс
  • Разреженный индекс

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

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

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

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

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

Пример разреженного индекса

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

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

Этот двухуровневый метод индексации базы данных используется для уменьшения размера отображения первого уровня. Для первого уровня из-за этого выбирается большой диапазон чисел; размер отображения всегда остается небольшим.

Пример вторичной индексации

В базе данных банковского счета данные хранятся последовательно с помощью acc_no; Вы можете найти все счета в конкретном отделении банка ABC.

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

Индекс кластеризации

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

Пример:

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

Он рассматривается в одном кластере, а индексные точки указывают на кластер в целом. Здесь Department _no — неуникальный ключ.

Что такое многоуровневый индекс?

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

B-Tree Index

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

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

  • Ведущие узлы должны иметь от 2 до 4 значений.
  • Каждый путь от корня до листа в основном одинаковой длины.
  • Нелистовые узлы, кроме корневого, имеют от 3 до 5 дочерних узлов.
  • Каждый узел, который не является корнем или листом, имеет от n / 2] до n дочерних узлов.

Преимущества индексации

Важные плюсы / преимущества индексирования:

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

Недостатки индексации

Важными недостатками / минусами индексации являются:

  • Для выполнения системы управления базами данных индексирования вам необходим первичный ключ в таблице с уникальным значением.
  • Вы не можете выполнять какие-либо другие индексы для проиндексированных данных.
  • Вам не разрешено разбивать организованную по индексу таблицу.
  • Индексирование SQL Снижение производительности в запросах INSERT, DELETE и UPDATE.

Резюме:

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

 

» Типы индексов, виды индексов, или какие вообще бывают индексы?

Типы индексов, виды индексов, или какие вообще бывают индексы?

// 2 августа, 2012 // MySQL, Веб-разработка

После прочтения многочисленной литературы по СУБД, некоторого опыта работы с MongoDB и листанию статей по базам данных у меня созрело желание сделать cheatsheet по индексам применительно к БД. А индексирование — достаточно интересный раздел теории баз данных, а главное — нужный в практике. Вообще-то говоря, золотое правило индексирования — иметь индекс под каждый запрос.

По порядку сортировки

  • Упорядоченные  — индексы, в которых элементы поля(столбца) упорядочены.
    • Возрастающие
    • Убывающие
  • Неупорядоченные — индексы, в которых элементы неупорядочены.

По источнику данных

  • Индексы по представлению (view).
  • Индексы по выражениям — например в PostgreSQL.

По воздействию на источник данных

  • Некластерный индекс — наиболее типичные представители семейства индексов. В отличие от кластерных, они не перестраивают физическую структуру таблицы, а лишь организуют ссылки на соответствующие строки. Для идентификации нужной строки в таблице некластерный индекс организует специальные указатели, включающие в себя: информацию об идентификационном номере файла, в котором хранится строка; идентификационный номер страницы соответствующих данных; номер искомой строки на соответствующей странице; содержимое столбца.
  • Кластерный индекс — Принципиальным отличием кластерного индекса от индексов других типов является то, что при его определении в таблице физическое расположение данных перестраивается в соответствии со структурой индекса. Логическая структура таблицы в этом случае представляет собой скорее словарь, чем индекс. Данные в словаре физически упорядочены, например по алфавиту. Кластерные индексы могут дать существенное увеличение производительности поиска данных даже по сравнению с обычными индексами. Увеличение производительности особенно заметно при работе с последовательными данными.

По структуре

  • B*-деревья
  • B+-деревья
  • B-деревья
  • Хеши.

По количественному составу

  • Простой индекс (индекс с одним ключом) — строится по одному полю.
    Составной (многоключевой, композитный) индекс — строится по нескольким полям. Важен порядок следования полей (например в MongoDB).
    Индекс с включенными столбцами — Некластеризованный индекс, дополнительно содержащий кроме ключевых столбцов еще и неключевые.
  • Главный индекс (индекс по первичному ключу) — это тот индексный ключ, под управлением которого в данный момент находится таблица. Таблица не может быть отсортирована по нескольким индексным ключам одновременно. Хотя, если одна и та же таблица открыта одновременно в нескольких рабочих областях, то у каждой копии таблицы может быть назначен свой главный индекс.

По характеристике содержимого

  • Уникальный индекс — состоит из множества уникальных значений поля.
    Плотный индекс (NoSQL) — индекс, при котором, каждом документе в индексируемой коллекции соответствует запись в индексе, даже если в документе нет индексируемого поля.
  • Разреженный индекс (NoSQL) — тот, в котором представлены только те документы, для которых индексируемый ключ имеет какое-то определённое значение (существует).
  • Пространственный индекс — оптимизирован для описания географического местоположения. Представляет из себя многоключевой индекс состоящий из широты и долготы.
  • Составной пространственный индекс — индекс, включающий в себя кроме широты и долготы ещё какие-либо мета-данные (например теги). Но географические координаты должны стоять на первом месте.
  • Полнотекстовый (инвертированный) индекс — словарь, в котором перечислены все слова и указано, в каких местах они встречаются. При наличии такого индекса достаточно осуществить поиск нужных слов в нём и тогда сразу же будет получен список документов, в которых они встречаются.
  • Хэш-индексы — предполагают хранение не самих значений, а их хэшей, благодаря чему уменьшается размер(а, соответственно, и увеличивается скорость их обработки) индексов из больших полей. Таким образом, при запросах с использованием HASH-индексов, сравниваться будут не искомое со значения поля, а хэш от искомого значения с хэшами полей.
    Из-за нелинейнойсти хэш-функций данный индекс нельзя сортировать по значению, что приводит к невозможности использования в сравнениях больше/меньше и «is null». Кроме того, так как хэши не уникальны, то для совпадающих хэшей применяются методы разрешения коллизий.
  • Битовый индекс (bitmap index) — метод битовых индексов заключается в создании отдельных битовых карт (последовательность 0 и 1) для каждого возможного значения столбца, где каждому биту соответствует строка с индексируемым значением, а его значение равное 1 означает, что запись, соответствующая позиции бита содержит индексируемое значение для данного столбца или свойства.
  • Обратный индекс (reverse index) — это тоже B-tree индекс но с реверсированным ключом, используемый в основном для монотонно возрастающих значений(например, автоинкрементный идентификатор) в OLTP системах с целью снятия конкуренции за последний листовой блок индекса, т.к. благодаря переворачиванию значения две соседние записи индекса попадают в разные блоки индекса. Он не может использоваться для диапазонного поиска.
  • Функциональный (function-based) индекс (индекс по вычисляемому полю) — индекс, ключи которого хранят результат пользовательских функций. Функциональные индексы часто строятся для полей, значения которых проходят предварительную обработку перед сравнением в команде SQL. Например, при сравнении строковых данных без учета регистра символов часто используется функция UPPER. Создание функционального индекса с функцией UPPER улучшает эффективность таких сравнений. Кроме того, функциональный индекс может помочь реализовать любой другой отсутствующий тип индексов данной СУБД(кроме, пожалуй, битового индекса, например, Hash для Oracle)
  • Первичный индекс — уникальный индекс по полю первичного ключа.
  • Вторичный индекс — индекс по другим полям (кроме поля первичного ключа).
  • XML-индекс — вырезанное материализованное представление больших двоичных XML-объектов (BLOB) в столбце с типом данных xml.

По механизму обновления

  • Полностью перестраиваемый — при добавлении элемента заново перестраивается весь индекс.
  • Пополняемый (балансируемый) — при добавлении элементов индекс перестраивается частично (например одна из ветви) и периодически балансируется.

По покрытию индексируемого содержимого

  • Полностью покрывающий (полный) индекс — покрывает всё содержимое индексируемого объекта.
  • Частичный (partial) индекс — это индекс, построенный на части таблицы, удовлетворяющей определенному условию самого индекса. Данный индекс создан для уменьшения размера индекса.
  • Инкрементный (Delta) индекс — индексируется малая часть данных(дельта), как правило, по истечении определённого времени. Используется при интенсивной записи. Например, полный индекс перестраивается раз в сутки, а дельта-индекс строится каждый час. По сути это частичный индекс по временной метке.
  • Real-time индекс — особый вид delta индекса в Sphinx, характеризующийся высокой скоростью построения. Предназначен для часто-меняющихся данных.

Индексы в кластерных системах

  • Глобальный индекс — индекс по всему содержимому всех shard’ов (секций).
  • Сегментный индекс — глобальный индекс по полю-сегментируемому ключу (shard key). Используется для быстрого определения сегмента(shard’а), на котором хранятся данные в процессе маршрутизации запроса в кластере БД.
  • Локальный индекс —  индекс по содержимому только одного shard’а.

Если есть неточности, коррективы — пишите в комменты. Надеюсь кому-то будет полезным эта «шпаргалка».

Ссылки

http://ru.wikipedia.org/wiki/Индекс_(базы_данных)
http://habrahabr.ru/post/102785/
http://www.sql.ru/articles/mssql/03013101indexes.shtml#16_3
http://msdn.microsoft.com/ru-ru/library/ms175049(v=sql.90).aspx

Спасибо!


Если вам помогла статья, или вы хотите поддержать мои исследования и блог — вот лучший способ сделать это:

18) Кластерный против некластеризованного индекса

Что такое индекс?

Индекс — это ключ, построенный из одного или нескольких столбцов в базе данных, который ускоряет выборку строк из таблицы или представления. Этот ключ помогает базе данных, такой как Oracle, SQL Server, MySQL и т. Д., Быстро найти строку, связанную со значениями ключа.

Два типа индексов:

  • Кластерный индекс
  • Некластерный индекс

В этом уроке вы узнаете:

Что такое кластерный индекс?

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

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

Что такое некластеризованный индекс?

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

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

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

Характеристика кластерного индекса

  • Стандартное и отсортированное хранилище данных
  • Используйте только один или несколько столбцов для индекса
  • Помогает хранить данные и индексировать вместе
  • фрагментация
  • операции
  • Сканирование кластеризованного индекса и поиск индекса
  • Поиск ключей

Характеристики некластеризованных индексов

  • Хранить только значения ключей
  • Указатели на строки кучи / кластерного индекса
  • Позволяет вторичный доступ к данным
  • Мост к данным
  • Операции сканирования индекса и поиска индекса
  • Вы можете создать некластеризованный индекс для таблицы или представления
  • Каждая строка индекса в некластеризованном индексе хранит значение некластеризованного ключа и локатор строк.

Пример кластерного индекса

В приведенном ниже примере SalesOrderDetailID является кластеризованным индексом. Пример запроса для получения данных

SELECT CarrierTrackingNumber, UnitPrice
FROM SalesData
WHERE SalesOrderDetailID = 6

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

В следующем примере некластеризованный индекс создается для OrderQty и ProductID следующим образом

CREATE INDEX myIndex ON
SalesData (ProductID, OrderQty)

Следующий запрос будет получен быстрее по сравнению с кластерным индексом.

SELECT Product ID, OrderQty
FROM SalesData
WHERE ProductID = 714

Различия между кластерным индексом и некластеризованным индексом

параметры кластерный Некластерированных
Использовать для Вы можете сортировать записи и физически хранить кластерный индекс в памяти в соответствии с порядком. Некластеризованный индекс помогает вам создать логический порядок для строк данных и использует указатели для физических файлов данных.
Метод хранения Позволяет хранить страницы данных в конечных узлах индекса. Этот метод индексации никогда не сохраняет страницы данных в конечных узлах индекса.
Размер Размер кластерного индекса довольно велик. Размер некластеризованного индекса невелик по сравнению с кластеризованным индексом.
Доступ к данным Быстрее Медленнее по сравнению с кластерным индексом
Дополнительное дисковое пространство Не требуется Требуется хранить индекс отдельно
Тип ключа По умолчанию первичные ключи таблицы являются кластерным индексом. Его можно использовать с уникальным ограничением на таблицу, которое действует как составной ключ.
Главная особенность Кластерный индекс может повысить производительность поиска данных. Он должен быть создан на столбцах, которые используются в соединениях.

Преимущества кластерного индекса

Плюсы / преимущества кластерного индекса:

  • Кластерные индексы являются идеальным вариантом для диапазона или группы с запросами типа max, min, count
  • В этом типе индекса поиск может идти прямо к определенной точке данных, чтобы вы могли продолжать последовательное чтение оттуда.
  • Метод кластеризованного индекса использует механизм определения местоположения для определения позиции индекса в начале диапазона.
  • Это эффективный метод для поиска диапазона, когда запрашивается диапазон значений ключа поиска.
  • Помогает минимизировать передачу страниц и максимизировать попадания в кэш.

Преимущества некластеризованного индекса

Плюсы использования некластеризованного индекса:

  • Некластеризованный индекс помогает быстро получать данные из таблицы базы данных.
  • Помогает избежать накладных расходов, связанных с кластерным индексом
  • Таблица может иметь несколько некластеризованных индексов в РСУБД. Таким образом, его можно использовать для создания более одного индекса.

Недостатки кластерного индекса

Вот минусы / недостатки использования кластерного индекса:

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

Недостатки некластеризованного индекса

Вот минусы / недостатки использования некластеризованного индекса:

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

КЛЮЧЕВАЯ РАЗНИЦА

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

 

Индексы базы данных — Студопедия

Структура таблиц базы данных

Реляционная модель базы данных

Форма хранения информации

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

Системы управления базами данных, использующие способ хранения информации в виде связанных между собою таблиц, называют реляционными.

Вообще–то табличная форма представления и хранения информации является весьма удобной и поэтому получила широкое распространение. Примером тому могут быть текстовый редактор MS Word, электронные таблицы MS Excel. Однако различия между текстовым редактором и электронными таблицами с одной стороны и системами управления базами данных с другой стороны существенны.

Таблицы текстового редактора MS Word предназначены для наглядного представления текстовой или числовой информации, а автоматизация вычислений и поиска данных у них развита слабо.

Таблицы программы MS Excel служат в основном для автоматизации вычислений.

Основное же назначение таблиц базы данных – это обеспечение эффективного и автоматизированного поиска необходимых данных среди большого их объема и многообразия.

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


Каждая таблица базы данных содержит информацию о группе однородных объектов. Пример такой таблицы представлен рис.22.1.

Электродвигатели
Код Тип Мощность, кВт Напряжение, В Ток, А Частота вращения, Об/мин
П31 67,5
П42 97,5
П58 112,5
Строка состояния

Рис.21.1 Общий вид таблицы базы данных

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

Табличную форму размещения и хранения данных предложил в 1970 г. Э.Ф. Кодд. Он показал, что набор двухмерных таблиц, при соблюдении определенных ограничений, позволяет хранить информацию об объектах и моделировать связи между ними. В терминологии Кодда связанные между собой таблицы называются


отношениями (англ. relation). Отсюда и название модели – реляционная.

Среди многообразия разработанных СУБД наибольшее распространение получила система управления базами данных, корпорации Microsoft – MS Access.

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

Запись представляет собой набор значений всех атрибутов информационной модели рассматриваемой сущности. Проще говоря, запись – это совокупность сведений об объекте. В одной таблице все записи состоят из одних и тех же полей, поскольку таблица формируется из однородных объектов. Каждый объект имеет свой набор значений в этих полях. В некоторых полях значения могут отсутствовать или как принято считать – иметь значение Null. Название каждого поля в таблице уникальное. То есть одна таблица не может иметь в своем составе два или более полей с одинаковым названием.

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

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

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

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

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

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

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

Индексирование в базах данных с ПРИМЕРАМИ

  • Home
  • Testing

      • Back
      • Agile Testing
      • BugZilla
      • Cucumber
      • Database Testing
      • ETL Testing
      • JUnit
      • LoadRunner
      • Ручное тестирование
      • Мобильное тестирование
      • Mantis
      • Почтальон
      • QTP
      • Назад
      • Центр качества (ALM)
      • RPA 9000 Testing SAPI
      • Управление
      • TestLink
  • SAP

      • Назад
      • ABAP
      • APO
      • Начинающий
      • Basis
      • BODS
      • BI
      • BPC
      • CO
      • Назад
      • CRM
      • Crystal Reports
      • FICO
      • 000 HRM
      • 000 HRM
      • MM Pay
      • Назад
      • PI / PO
      • PP
      • SD
      • SAPUI5
      • Безопасность
      • Менеджер решений
      • Successfactors
      • SAP Tutorials

  • Web
  • Web
  • AngularJS
  • ASP.Net
  • C
  • C #
  • C ++
  • CodeIgniter
  • СУБД
  • JavaScript
  • Назад
  • Java
  • JSP
  • Kotlin
  • Linux
  • Linux
  • Kotlin
  • Linux
  • js
  • Perl
  • Назад
  • PHP
  • PL / SQL
  • PostgreSQL
  • Python
  • ReactJS
  • Ruby & Rails
  • Scala
  • SQL
  • 000
  • SQL
  • 000 0003 SQL 000 0003 SQL 000
  • UML
  • VB.Net
  • VBScript
  • Веб-службы
  • WPF
  • Обязательно учите!

      • Назад
      • Бухгалтерский учет
      • Алгоритмы
      • Android
      • Блокчейн
      • Business Analyst
      • Создание веб-сайта
      • CCNA
      • Облачные вычисления
      • 0003 COBOL
      • 000 Compiler
          9000 Встроенный
        • 000 9000 Compiler
        • Ethical Hacking
        • Учебники по Excel
        • Программирование на Go
        • IoT
        • ITIL
        • Jenkins
        • MIS
        • Сети
        • Операционная система
        • 0003
        • Назад
        • Управление проектами Обзоры
        • Salesforce
        • SEO
        • Разработка программного обеспечения
        • VB A
    • Big Data

        • Назад
        • AWS
        • BigData
        • Cassandra
        • Cognos
        • Хранилище данных
        • 0003
        • HBOps
        • 0003
        • HBOps
        • MicroStrategy
        • MongoDB
    .

    новейших вопросов о базах данных — qaru Переполнение стека
    1. Около
    2. Продукты
    3. Для команд
    1. Переполнение стека Общественные вопросы и ответы
    2. Переполнение стека для команд Где разработчики и технологи делятся частными знаниями с коллегами
    3. Вакансии Программирование и связанные с ним технические возможности карьерного роста
    4. Талант Нанимайте технических специалистов и создавайте свой бренд работодателя
    5. Реклама Обратитесь к разработчикам и технологам со всего мира
    6. О компании

    Загрузка…

    .Индексирование

    — как увидеть индексы для базы данных или таблицы в MySQL?

    Переполнение стека
    1. Около
    2. Продукты
    3. Для команд
    1. Переполнение стека Общественные вопросы и ответы
    2. Переполнение стека для команд Где разработчики и технологи делятся частными знаниями с коллегами
    3. Вакансии Программирование и связанные с ним технические возможности карьерного роста
    4. Талант Нанимайте технических специалистов и создавайте свой бренд работодателя
    5. Реклама Обратитесь к разработчикам и технологам со всего мира
    6. О компании
    .Индексы

    — Документация BaseX

    Эта статья является частью портала XQuery. Он содержит информацию о доступных индексных структурах.

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

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

    Дополнительные примеры перезаписи индексов представлены в нашей статье об оптимизации XQuery.

    Структурные индексы создаются автоматически и не могут быть удалены пользователем:

    Name Index [править]

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

    Индекс имени, например, применяется для отмены шагов определения местоположения, которые никогда не дадут результатов:

     (: будет заменено на пустую последовательность :)
    / не существующее-имя
     

    К содержимому индексов имен можно получить прямой доступ с помощью функций XQuery index: element-names и index: attribute-names.

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

    Указатель пути [править]

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

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

    • Дочерние шаги будут преобразованы в несколько дочерних шагов. Дочерние шаги оцениваются быстрее, так как необходимо пройти меньшее количество узлов:
     doc ('factbook.xml') // Province,
    (: ... будет переписан на ... :)
    документ ('factbook.xml') / mondial / страна / провинция
     
    • Функция fn: count будет предварительно оценена путем поиска числа в индексе:
     count (doc ('factbook') // country)
     
    • Отдельные значения элементов или атрибутов также можно найти в индексе:
     отдельные значения (db: open ('factbook') // религии)
     

    К содержимому индекса пути можно получить прямой доступ с помощью функции XQuery index: facets.

    Если база данных обновлена, статистика в индексе пути будет недействительной.

    Указатель документов

    [править]

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

    Индекс обычно ускоряет доступ к отдельным документам и путям базы данных. Он всегда будет обновляться.

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

    В графическом пользовательском интерфейсе структурами индексов можно управлять в диалоговых окнах для создания новых баз данных или отображения свойств базы данных. В командной строке команды CREATE INDEX и DROP INDEX используются для создания и удаления структур индекса. С INFO INDEX вы получите некоторое представление о содержании структуры индекса, а SET позволяет вам изменить значения индекса по умолчанию для новых баз данных:

    • OPEN справочник; CREATE INDEX fulltext : Открыть базу данных; создать полнотекстовый индекс
    • OPEN справочник; ИНФОРМАЦИОННЫЙ ИНДЕКС ТОКЕН : Открытая база данных; показать информацию об индексе токена
    • SET ATTRINDEX true; УСТАНОВИТЕ имя идентификатора ATTRINCLUDE; СОЗДАТЬ информационную книгу БД.xml : включить индекс атрибута; только индексировать атрибуты id и name; создать базу данных

    С помощью XQuery можно создавать и отбрасывать структуры индексов с помощью db: optimize:

     (: Оптимизировать указанную базу данных, создать полнотекстовый индекс для текстов указанных элементов :)
    db: оптимизировать (
      'фактологический справочник',
      ложный(),
      map {'ftindex': true (), 'ftinclude': 'p div'}
    )
     
    Текстовый указатель

    [править]

    Exact Queries [править]

    Этот индекс ссылается на текстовые узлы документов.Он будет использоваться для ускорения сравнения строк в выражениях пути. Все следующие запросы будут переписаны для доступа к индексу:

     (: пример 1 :)
    // * [text () = 'Германия'],
    (: пример 2 :)
    doc ('factbook.xml') // имя [. = 'Германия'],
    (: пример 3 :)
    для $ c в db: open ('factbook') // country
    где $ c // city / name = 'Ханой'
    вернуть $ c / имя
     

    Перед фактической перезаписью индекса применяются некоторые предварительные оптимизации:

    • В примере 2 выражение элемента контекста . будет заменен шагом text () .
    • В примере 3 предложение where будет преобразовано в предикат и присоединено к первому выражению пути.

    К индексированным текстовым узлам можно получить доступ напрямую с помощью функции XQuery db: text. Индексированные строковые значения можно найти с помощью index: text.

    Опция UPDINDEX может быть включена, чтобы поддерживать этот индекс в актуальном состоянии:

     дБ: оптимизировать (
      'mydb',
      правда(),
      map {'updindex': true (), 'textindex': true (), 'textinclude': 'id'}
    )
     

    Range Queries [править]

    Текстовый индекс также поддерживает запросы диапазона на основе сравнения строк:

     (: пример 1 :)
    db: open ('Library') // Средний [Год> = '2011' и Год <= '2016'],
    (: пример 2 :)
    пусть $ min: = '2014-04-16T00: 00: 00'
    let $ max: = '2014-04-19T23: 59: 59'
    return db: open ('news') // запись [дата-время> $ min и дата-время <$ max]
     

    С помощью db: text-range вы можете получить доступ ко всем текстовым узлам, значения которых находятся между минимальным и максимальным значением.

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

    Индекс атрибута

    [править]

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

     (: 1-й пример :)
    // страна [@car_code = 'J'],
    (: 2-й пример :)
    // провинция [@ * = 'Hokkaido'] // название,
    (: 3-й пример :)
    // море [@depth> '2100' и @depth <'4000']
    (: 4-й пример :)
    fn: id ('f0_119', db: open ('фактологический бюллетень'))
     

    Узлы атрибутов (которые можно использовать в качестве отправных точек навигации) могут быть получены непосредственно из индекса с помощью функций XQuery db: attribute и db: attribute-range.К содержимому индекса ( строк и ) можно получить доступ с помощью атрибутов index:.

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

    Индекс токенов

    [править]

    Во многих диалектах XML, таких как HTML или DITA, несколько токенов хранятся в значениях атрибутов. Индекс токена может быть создан для ускорения извлечения этих токенов. Функции XQuery fn: contains-token , fn: tokenize и fn: idref по возможности переписываются для доступа к индексу.Если индекс токена существует, он будет, например, использоваться для следующих запросов:

     (: 1-й пример :)
    // div [содержит-токен (@class, 'row')],
    (: 2-й пример :)
    // p [tokenize (@class) = 'row'],
    (: 3-й пример :)
    документ ('graph.xml') / idref ('edge8')
     

    Узлы атрибутов с совпадающим значением (содержащим по крайней мере один из набора заданных токенов) могут быть напрямую получены из индекса с помощью функции XQuery db: token. К содержимому индекса ( строк токенов ) можно получить доступ с помощью index: tokens.

    Полнотекстовый указатель

    [править]

    Полнотекстовый индекс содержит нормализованные токены текстовых узлов документа. Он используется для ускорения запросов с , содержащим текстовое выражение , и он способен обрабатывать подстановочные знаки и операции нечеткого поиска. Доступны три стратегии оценки: стандартное последовательное сканирование базы данных, оценка на основе полнотекстового индекса и гибридная, сочетающая обе стратегии (см. «Полнотекстовая реализация XQuery в BaseX»).

    Если существует полнотекстовый индекс, все следующие запросы будут перезаписаны для доступа к индексу:

     (: 1-й пример :)
    // country [name / text () содержит текст 'и'],
    (: 2-й пример :)
    // религии [.// text () содержит текст {'католический', 'римский'}
        расстояние без учета регистра не более 2 слов]
     

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

    • Stemming : токены ограничиваются до индексации (опция: STEMMING )
    • С учетом регистра : токены индексируются с учетом регистра (опция: CASESENS )
    • Диакритические знаки : также индексируются диакритические знаки (опция: DIACRITICS )
    • Список стоп-слов : список стоп-слов может быть определен для уменьшения количества проиндексированных токенов (опция: STOPWORDS )
    • Язык : дополнительные сведения см. В разделе «Языки» (опция: ЯЗЫК )

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

     <команды>
      
       истина 
       истина 
        house  
      
       / текст [.содержит текст {'дома'}] 
      
       / текст [. содержит текст {'дома'} без выделения корней] 
    
     

    Текстовые узлы можно напрямую запросить из индекса с помощью функции XQuery ft: search. Доступ к содержимому индекса можно получить с помощью ft: tokens.

    Selective Indexing [править]

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

    • * : все наименования
    • имя : элементы или атрибуты с именем имя , которые находятся в пустом пространстве имен по умолчанию
    • *: имя : элементы или атрибуты называются имя , независимо от того, какое пространство имен
    • Q {uri} * : все элементы или атрибуты в пространстве имен uri
    • Q {uri} name : элементы или атрибуты, называемые name в пространстве имен uri

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

    Команды
     SET ATTRINCLUDE id, name
    СОЗДАТЬ информационную книгу БД http://files.basex.org/xml/factbook.xml '
    # Сброс настроек
    УСТАНОВИТЬ ATTRINCLUDE
     
    XQuery
     db: create ('factbook', 'http://files.basex.org/xml/factbook.xml', '',
      map {'attrinclude': 'id, name'})
     

    С CREATE INDEX и db: optimize новые параметры выборочной индексации будут применены к существующей базе данных.

    Принудительная перезапись [править]

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

    С помощью опции ENFORCEINDEX можно принудительно выполнить перезапись определенных индексов.Хотя эту опцию можно включить глобально, обычно лучше использовать ее как Pragma. Два примера:

    • В запросе ниже будут адресованы 10 баз данных. Если заранее известно, что эти базы данных содержат актуальный текстовый индекс, перезапись индекса может быть выполнена следующим образом:
     (# db: enforceindex #) {
      за $ n от 1 до 10
      let $ db: = 'person' || $ n
      return db: open ($ db) // человек [имя / текст () = 'Джон']
    }
     
    • Следующий запрос содержит два предиката, которые можно переписать для доступа к индексу.Если известно, что автоматически выбранная перезапись не является оптимальной, можно применить другую перезапись индекса, окружив конкретное выражение прагмой:
     db: open ('factbook') // country
      [(# db: enforceindex #) {
       @population> "10000000" и
       @population <'10999999'
      }]
      [Religions / text () = 'Протестант']
     

    Опция также может быть назначена предикатам с динамическими значениями. В следующем примере сравнение первого сравнения будет переписано для доступа к индексу.Без выражения прагмы второе сравнение предпочтительнее и выбирается для переписывания, потому что статически известная строка позволяет получить точную оценку стоимости:

     для $ name в ('Германия', 'Италия')
    для $ country в db: open ('factbook') // country
    где (# db: enforceindex #) {$ country / name = $ name}
    где $ country / Religions / text () = 'Протестант'
    вернуть $ страна
     

    Обратите внимание, что:

    • Опцию следует включать только в том случае, если указанные базы данных существуют, имеют все необходимые структуры индекса и обновлены (в противном случае вы получите сообщение об ошибке).
    • Если вы обращаетесь к полнотекстовому индексу и используете параметры индексации, отличные от параметров по умолчанию, вам нужно будет указать их в своем запросе (через с использованием основы , с использованием языка de и т. Д.).
    • Если у вас есть более одной директивы enforce в одном выражении пути, будет учитываться только первая.
    • В общем, всегда есть выражения, которые нельзя переписать для доступа к индексу. Если вы принудительно перезаписываете, у вас не будет гарантии, что индекс будет использоваться.

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

    .

  • Добавить комментарий

    Ваш адрес email не будет опубликован. Обязательные поля помечены *