Как я знаю, когда индексировать столбец, и с чем? - PullRequest
21 голосов
/ 04 ноября 2010

В документах для различных ORM они всегда предоставляют способ создания индексов и т. Д. Они всегда упоминают, что необходимо обязательно создать соответствующие индексы для эффективности, как если бы это было присуще знанию не написанного от руки SQLer, который нуждается виспользовать ORM.Мое понимание индексов (вне PK) в основном таково: если вы планируете выполнять LIKE запросов (т. Е. Поиск) на основе содержимого столбца, вы должны использовать полнотекстовый индекс для этого столбца.Что еще я должен знать об индексах (в основном, касающихся эффективности)?Я чувствую, как будто у моего порога есть мир знаний, но под ним застрял огромный свернутый коврик для мыши, так что я не могу дозвониться (не знаю, почему я чувствовал, что мне нужно это сказать, носпасибо за предоставление дивана).

Ответы [ 2 ]

22 голосов
/ 04 ноября 2010

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

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

Итак ... вы бы создалииндекс, когда у вас есть информация, по которой вам нужно часто искать.Обычные индексы не помогают вам для «частичных» запросов, подобных запросам LIKE, но всякий раз, когда вам нужно получить набор результатов, где поле X имеет определенные значения, они не позволяют СУБД «сканировать» всю таблицу, ища совпадающие значения.

Они также помогают, когда вам нужно отсортировать по столбцу.

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


Вы упомянули полный текстиндексы и ПК (первичные ключи).Они отличаются от обычных индексов, хотя они часто служат схожим целям.

Во-первых, обратите внимание, что первичный ключ обычно является индексом (в MSSQL, по сути, «кластеризованным индексом»), но это не нужнобыть конкретно.Например, MSSQL PK по умолчанию является кластерным индексом;Кластерные индексы отличаются тем, что они не являются отдельным битом данных, хранящихся в другом месте, но сами данные располагаются в таблице по порядку кластерного индекса.Вот почему популярный PK - это значение int, которое генерируется автоматически с последовательными, возрастающими значениями.Таким образом, кластерный индекс сортирует данные в таблице конкретно по значению поля.Сравните это с традиционным словарем;сами записи упорядочены по «ключу», то есть определенному слову.

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


Полнотекстовые индексы - это совершенно разные звери.Они используют некоторые из тех же принципов, но то, что они делают, не совсем то же самое, что и обычные индексы, которые я описываю.Также: в некоторых СУБД LIKE запросы делают не использование полнотекстового индекса;требуются специальные операторы запросов.

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

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

1 голос
/ 04 ноября 2010

Этот ответ зависит от Oracle, но основные моменты в ответах относятся к большинству систем реляционных баз данных

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

...