Каковы различные типы индексов, каковы преимущества каждого? - PullRequest
31 голосов
/ 26 сентября 2008

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

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

Ответы [ 11 ]

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

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

Как говорится в статье:

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

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

6 голосов
/ 26 сентября 2008

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

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

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

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

5 голосов
/ 26 сентября 2008

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

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

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

select name from customers where is_active is true;
3 голосов
/ 27 сентября 2008

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

Для столбца low cardinality , например GENDER, используйте растровое изображение. Для высокой мощности , такой как LAST_NAME, используйте b-tree.

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

Для OLTP системы с частыми DML и обычными запросами используйте btree. Для системы OLAP с редкими запросами DML и adhoc используйте растровое изображение.

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

2 голосов
/ 26 сентября 2008

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

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

2 голосов
/ 26 сентября 2008

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

2 голосов
/ 26 сентября 2008

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

1 голос
/ 22 февраля 2015
  1. Unique
  2. кластер
  3. некластерном
  4. колонка магазина
  5. Указатель с включенным столбцом
  6. индекс по вычисляемому столбцу
  7. фильтруется
  8. пространственное * * 1016
  9. XML
  10. полный текст
0 голосов
/ 14 сентября 2016

Для просмотра типов индексов и их значения посещений: https://msdn.microsoft.com/en-us/library/ms175049.aspx

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