Какие существуют типы индексов и каковы преимущества каждого из них?

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

Вопрос

Какие существуют типы индексов и каковы преимущества каждого из них?

Я слышал о покрывающих и кластеризованных индексах. Есть ли еще?Где бы вы их использовали?

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

Решение

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

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

В OdeToCode есть хорошая статья, раскрывающая основные различия.

Как сказано в статье:

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

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

добавлю пару типов индексов

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

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

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

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

create index i on customers (id, name, whatever) where is_active is true;

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

select name from customers where is_active is true;

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

Для низкая мощность столбец типа ПОЛ, используйте растровое изображение.Для высокая мощность например LAST_NAME, используйте b-дерево.

Это не относится к Oracle, где выбор индекса должен основываться на типе приложения (OLTP или OLTP).ОЛАП).DML в таблицах с растровыми индексами может вызвать серьезные конфликты блокировок.С другой стороны, Oracle CBO может легко объединить несколько индексов растровых изображений вместе, а индексы растровых изображений можно использовать для поиска нулей.Как общее правило:

Для ОЛТП В системе с частыми DML и рутинными запросами используйте btree.Для ОЛАП В системе с нечастыми DML и специальными запросами используйте растровое изображение.

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

Разные системы баз данных имеют разные имена для одного и того же типа индекса, поэтому будьте с этим осторожны.Например, то, что SQL Server и Sybase называют «кластеризованным индексом», в Oracle называется «таблицей, организованной по индексу».

Предлагаю вам поискать в блогах Джейсона Мэсси (http://statisticsio.com/) и Брент Озар (http://www.brentozar.com/) для получения соответствующей информации.У них есть сообщение о реальном сценарии, связанном с индексами.

Oracle имеет различные комбинации b-дерева, растрового изображения, секционированного и несекционированного, обратного байта, соединения растрового изображения и индексов домена.

Вот ссылка на документацию 11gR1 по этому вопросу: http://download.oracle.com/docs/cd/B28359_01/server.111/b28274/data_acc.htm#PFGRF004

  1. Уникальный
  2. кластер
  3. некластерный
  4. хранилище столбцов
  5. Индекс с включенным столбцом
  6. индекс вычисляемого столбца
  7. фильтрованный
  8. пространственный
  9. xml
  10. полный текст

SQL Server 2008 имеет отфильтрованные индексы, аналогично PostgreSQL частичные индексы.Оба позволяют включать в индекс только строки, соответствующие заданным критериям.

Синтаксис идентичен PostgreSQL:

create index i on Customers(name) where is_alive = cast(1 as bit);

Чтобы просмотреть типы индексов и их значения, посетите:https://msdn.microsoft.com/en-us/library/ms175049.aspx

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