Где я могу найти некоторые рекомендации по индексным стратегиям?

22

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

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

SpecialAgent_W436
источник
7
Для руководства по индексированию, используйте- the-index-luke.com
Майк Шеррилл 'Cat Recall'

Ответы:

24

короткий

Я думаю, что правило "слишком много индексов" немного вводит в заблуждение.

Длинная

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

То, что у вас есть, это низкое качество индексации. Примеры:

  • широкие кластерные индексы (особенно SQL Server)
  • немонотонный кластерный индексированный
  • перекрывающиеся индексы (например, cold, coleиcold, cole, colf)
  • многие индексы с одним столбцом (также перекрывающиеся с более полезными индексами), которые бесполезны для ваших запросов
  • не включает, не охватывает (например, все индексы одного столбца)
  • ...

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

Вообще, я бы начал с

  • кластерный индекс (обычно ПК)
  • уникальные индексы (не ограничения, они не могут покрывать)
  • столбцы внешнего ключа

Тогда я бы посмотрел на:

  • общие запросы и посмотрим, что мне нужно. Запрос, выполняемый каждую секунду, нуждается в настройке. Отчет в воскресенье 4 утра может подождать.
  • с SQL Server, взвешенные отсутствующие индексы DMV

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

ГБН
источник
2
Откуда вы взяли эти цифры? 98% кажется очень высокой, особенно в возрасте «больших данных» (он же магазине все , и надеюсь , что это полезно когда- нибудь)
гт
7

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

ldsandon
источник
7

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

На ваш вопрос можно ответить 50 различными способами. На самом деле все сводится к имеющимся у вас данным и к тому, как их будут запрашивать. Общее правило заключается в том, что у вас всегда должен быть кластеризованный индекс для каждой таблицы, чтобы избежать кучи. Кластерные индексы обычно должны быть как можно меньше. Если таблица имеет кластеризованный индекс, то все записи индекса на листовых страницах некластеризованного индекса будут хранить значение записи соответствующего кластеризованного индекса для поиска по закладкам. Если таблица представляет собой кучу, то SQL создаст уникальный идентификатор для поиска по закладкам. Я не могу вспомнить размер, это 8 или 16 байтов. Это может оказаться гораздо большим типом данных, чем INT. Представьте себе 8 некластеризованных индексов в таблице кучи.

TRAD
источник
Просто примечание для читателей: MS SQL «поиск по закладкам» эквивалентен Oracle «ACCESS BY ROWID». См stackoverflow.com/a/820731/122727
kubanczyk
5

Я хочу добавить, что разные базы данных требуют разных стратегий. Давайте сравним MySQL с InnoDB и PostgreSQL для примера.

InnoDB

Таблицы InnoDB - это в основном индекс b-дерева первичного ключа, который расширен, чтобы включить информацию строки в элемент индекса. Сканирование в физическом порядке не поддерживается, и все сканирования выполняются в логическом порядке. Это означает две вещи:

  1. Последовательное сканирование в Innodb генерирует много случайных дисковых операций ввода-вывода, и

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

  3. Поиск в первичном ключе быстрее в этой модели, чем в любом другом подходе.

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

PostgreSQL

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

Первичные ключи в PostgreSQL - это в основном подмножество уникальных индексов, где никакие значения не могут быть NULL. УНИКАЛЬНЫЕ ограничения выполняются с использованием неявных индексов, а некоторые другие типы индексов поддерживаются различными операциями, возможными в индексе.

Это означает:

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

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

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

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

TL; DR

Знай свою РСУБД.

Крис Траверс
источник
4

Из Руководства по концепциям Oracle 11.2:

Из руководства по настройке производительности 11.2:

Из руководства администратора 11.2:

Ли Риффель
источник
2

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

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

Здесь много информации, но не стоит ее пугать.

Кимберли о странице здесь

Роберт Миллер
источник