Что такое индексы и как я могу их использовать для оптимизации запросов в моей базе данных?

Я поддерживаю довольно значительное приложение и базу данных и замечаю некоторые плохие результаты работы базы данных в нескольких наших хранимых процедурах.

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

Мне в основном нужны индексы 101.

Может ли кто-нибудь дать мне ресурсы, чтобы я мог учиться?

Ответ 1

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

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

Индексы, созданные после создания, должны поддерживаться. Если у вас много активности по изменению данных, они могут быть фрагментированными и медленными, и их необходимо обновить. Читайте в книгах в Интернете об индексах. Вы также можете найти синтаксис для инструкции create index.

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

Ответ 2

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

Ответ 3

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

Таким образом, если количество данных, которое вы просматриваете, велико, вы абсолютно хотите добавить некоторые индексы.

В большинстве баз данных есть инструмент для объяснения того, как будет работать ваш запрос (для db2, это db2expln, что-то похожее, вероятно, для sqlserver), и инструмент для предложения индексов и других оптимизаций (db2advis для db2, опять-таки, вероятно, что-то похожее для sqlserver).

Ответ 4

Индексы - это метод, который используют системы баз данных для быстрого поиска данных. Аналогия в реальном мире - это индексы в книгах. Если автор/издатель делает хорошую работу по индексированию своей книги, читателю становится очень легко напрямую перейти на страницу, которую они хотят прочитать, просто взглянув на индекс. То же самое касается базы данных. Если в поле создается индекс, база данных предварительно сортирует данные. Когда запрос делается на данные, база данных использует индекс, чтобы определить, какое местоположение данные хранятся на жестком диске, и непосредственно идет туда. Если индексов нет, база данных должна смотреть на каждую запись, чтобы узнать, соответствует ли она критериям (критериям) вашего запроса.

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

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

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

Ответ 5

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

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

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

Ответ 6

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

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

Ответ 7

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

В принципе, ваша СУБД создаст какую-то древовидную структуру, которая будет сортировать данные (из одного столбца). Таким образом, легче искать данные в этом столбце.

http://en.wikipedia.org/wiki/Index_(database)

Ответ 8

Дополнительная информация об индексе!

Кластеризованные индексы представляют собой фактическое физическое расположение записей в таблице. Следовательно, вы можете иметь только один за стол.

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

Что-то, о чем нужно подумать - создание слишком большого количества индексов - обычная ловушка. Каждый раз, когда ваши данные обновляются, ваша БД должна искать этот индекс и обновлять его, вставляя запись в каждый индекс этой таблицы для этой новой строки. В транзакционных системах (подумайте: биржевые операции NYSE!), Которые могут быть убийцами приложений.

Ответ 9

для mssql (и, возможно, других) синтаксис выглядит так:

create index <indexname> on <tablename>(<column1>[,<column2>...])