2012-09-27 2 views
6

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

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

Что здесь происходит, чтобы ускорить поиск времени? Я немного читал о поиске с использованием B+-Trees, но описания были слишком сложными. То, что я ищу, - это обзор на высоком уровне того, что происходит, что-то, что помогает моему концептуальному пониманию этого, а не технические детали.

ответ

7

Хорошо, после того, как немного исследований и дискуссий, вот что я узнал:

Концептуально индекс представляет собой отсортированный копию поля данных она является индексация, где каждое значение индекса указывает на это оригинал (несортированные) ряд. Поскольку база данных знает, как сортируются значения, она может применять более сложные алгоритмы поиска, чем просто поиск значения от начала до конца. binary search algorithm - простой пример алгоритма поиска отсортированных списков и уменьшает максимальное время поиска от O (n) до O (log n).

В качестве побочного примечания: Достаточный алгоритм сортировки обычно принимает O (n log n), что означает (как мы все, вероятно, слышали раньше), вы должны помещать индексы только в поля, которые вы будете часто искать , так как добавить индекс (который включает сортировку) немного дороже, чем несколько раз выполнить полный поиск. Например, в большой базе данных из более чем 1 000 000 записей она находится в диапазоне 20x дороже сортировки, чем поиск один раз.

Редактировать: См. @Jarod Elliott's answer для более глубокого изучения эффективности поиска, особенно в отношении чтения с дисковых операций.

1

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

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

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

+0

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

+0

Итак, вы предлагаете хранить * ВСЕ * данные снова для каждой строки в каждой главе? Таким образом, у вас есть глава «фамилия», отсортированная по фамилии, с указанием имени, фамилии, DOB, места рождения, имени пользователя, электронной почты и биографии на 1000 слов. Затем у вас есть раздел «имя пользователя», отсортированный по имени пользователя, снова содержащий имя, фамилию, ДОБ, родину, имя пользователя, электронную почту и биографию на 1000 слов. Затем у вас есть «электронная почта», отсортированная по электронной почте, с указанием имени, фамилии, DOB, места рождения, имени пользователя, электронной почты и биографии на 1000 слов. Это кажется очень неэффективным использованием пространства ... –

+0

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

19

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

Чтобы проиллюстрировать точку, предположим, что все хранится на диске. Если вам нужно искать по каждой строке данных в таблице, которая ищет определенные значения в поле, вам все равно нужно прочитать всю строку данных с диска, чтобы убедиться, что она соответствует - это обычно называется «сканирование таблицы» ».

Если ваша таблица составляет 100 МБ, это 100 МБ, вы должны читать с диска.

Если вы индексируете столбец, который хотите выполнить поиск, в упрощенном виде индекс сохранит каждое уникальное значение данных и ссылку на точное местоположение соответствующей полной строки данных. Этот индекс может теперь составлять только 10 МБ по сравнению с 100 МБ для всей таблицы.

Чтение 10 МБ данных с диска (и, возможно, немного больше, чтобы прочитать данные полной строки для каждого соответствия) примерно в 10 раз быстрее, чем чтение 100 МБ.

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

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

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