Sql один индекс или несколько индексов - PullRequest
5 голосов
/ 17 сентября 2010

Допустим, у меня есть таблица продуктов.

В моем пользовательском интерфейсе я разрешаю пользователю выполнять поиск по имени, описанию, коду. Пользователь может выполнять поиск только по критериям.

Следует ли создать индекс для каждого критерия: имя, описание, кодили создать ОДИН единый индекс для всех 3?

Что заставит вас выбирать один против другого?

Ответы [ 5 ]

9 голосов
/ 17 сентября 2010

Всякий раз, когда вы строите индекс по нескольким столбцам, скажем, create index .. on T(A, B, C), индекс можно использовать только , если указаны самые левые столбцы.Если вы ищете по столбцу A, индекс может быть использован.Если вы выполняете поиск по столбцам A и B, тогда индекс можно использовать.При поиске по столбцам A и B и C можно использовать индекс.Но индекс будет не использоваться при поиске по столбцу B только или по столбцу C только или по столбцам B и *Только 1025 *.

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

8 голосов
/ 17 сентября 2010

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

3 голосов
/ 17 сентября 2010

Ответ: это зависит.

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

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

1 голос
/ 19 сентября 2010

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

  1. Достаточно одного индекса (на столбец) независимо от того, как вы упорядочиваете свои результаты (ASCending, DESCending)

  2. Для таких столбцов, как заголовок и описание, вы можете рассмотреть полнотекстовый поиск вместо обычных сравнений sql и фильтра LIKE.

1 голос
/ 17 сентября 2010

Если вы ограничиваете поиски использованием шаблона совпадения строк с начальными значениями ('search%'), тогда вам нужен индекс для этого столбца.Этот индекс представляет собой упорядоченные данные, которые могут быть seeked при поиске первого совпадения и считываются непрерывно, пока не будет достигнуто последнее совпадение.

Если у вас есть шаблон поиска без ограничений ('% search%') илиразрешить поиск любой комбинации из трех столбцов, вам нужен один индекс для всех трех.Этот индекс является копией столбцов, которые могут быть scanned быстрее, чем исходная таблица.

Как всегда, измерьте меру и измерьте

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