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

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

Рассмотрим следующий пример:

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

SELECT TestField FROM Example WHERE user_name=XXXX

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

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

Ответ 1

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

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

Если вы используете MySQL, например, вы можете проверить, использует ли движок индекс, добавив "объяснение" перед выбором - для вашего приведенного выше примера EXPLAIN SELECT TestField FROM Example WHERE username=XXXX

Ответ 2

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

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

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

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

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

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

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

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

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

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

Ответ 3

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

Ответ 4

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

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" вместо того, чтобы проходить через каждую таблицу каждой строки и каждого столбца.