Почему и где использовать индексы-плюсы и минусы

Я довольно новичок в программировании баз данных, и мне интересно, каковы негативные последствия индексов? Насколько я понял, индексы ускоряют операции, которые должны искать в базе данных определенное значение (например, SELECT).

Рассмотрим пример:

в таблице Example, с индексом на столбце user_name операция:

SELECT TestField FROM Example WHERE user_name=XXXX

будет быстрее в результате индекс.

мой вопрос: каковы минусы использования индексы? Если индекс просто дает нам плюсы (повышение производительности), почему они не установлены по умолчанию?

4 ответов


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

хотя он (в основном) ускоряет выбор, он замедляет вставки, обновления и удаления, потому что компонент database engine не должен записывать только данные, но и индекс. Индексу нужно место на жестком диске (и что гораздо важнее) в ОЗУ. Индекс, который не может храниться в ОЗУ, довольно бесполезен. Индекс столбца с несколькими различными значениями не имеет значения ускорьте выбор, потому что он не может сортировать много строк (например, столбец "пол", который обычно имеет только два разных значения - мужской, женский).

Если вы используете MySQL, например, вы можете проверить, использует ли enginge индекс, добавив "explain" перед select-for your above example EXPLAIN SELECT TestField FROM Example WHERE username=XXXX


что такое индексы, для чего они находятся в базе данных?

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

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

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

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

Почему индексы, созданные по умолчанию?

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

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

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

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


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


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

mytable{
 index   |  name  |   m/f   | age 
     1   | bob    | male    |  22 |
     2   | joe  b | male    |  27 |
     3   | sam    | female  |  42 |
     4   | bef    | female  |  21 |
}

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