[БЕЗ_ЗВУКА] Всем
привет.
В этом видео мы поговорим об индексах.
Индекс используется для повышения скорости поиска данных.
Представим, что у нас есть база данных пользователей, в которой находятся
миллионы записей, и мы хотим найти всех пользователей с возрастом 65 лет.
Что нужно сделать базе данных, чтобы совершить эту операцию поиска?
Да нужно просто перебрать все строки и для каждой строки проверить,
является ли возраст пользователя цифрой 65 или нет.
Если является, то отобрать эту строку, если нет, то пропустить.
Соответственно, базе данных нужно будет совершить миллионы операций сравнения,
чтобы выполнить этот поиск.
Но если по полю age построить индекс, то система управления базой данных создаст
определенную структуру, оптимизированную под поиск.
Как правило, это сбалансированное двоичное дерево поиска.
В этом дереве будут перечислены все возможные, все встречающиеся в базе данных
значения поля age, они будут упорядоченны определенным образом,
и для каждого значения будут ссылки на те строки, где оно встречается.
Эта структура позволит очень быстро искать всех пользователей с определенным
возрастом, с возрастом больше какого-то числа или меньше.
Например, чтобы найти всех пользователей с возрастом 65 лет в таблице из
миллиарда строк, нам придется сделать миллиард сравнений.
Но если по этому полю есть индекс, то число сравнений будет менее 30.
Просто представьте себе масштаб: миллиард сравнений или 30.
Выигрыш в скорости очевиден.
Также индекс может быть составным, по нескольким колонкам, двум и более.
В случае составного индекса важен порядок, в котором указаны в нем колонки.
Вспомним базу данных из предыдущего видео по книгам.
У книги есть автор и год издания, ну, помимо других полей.
Допустим, мы сделаем составной индекс по автору и году.
По этому индексу будет очень быстро найти все книги определенного автора,
все книги определенного автора за определенный год, но при этом индекс
не будет использоваться, если мы просто захотим найти все книги за какой-то год.
Почему так происходит?
Внутри индекса по автору и году книги будут упорядочены сначала по автору,
а внутри одного и того же автора — по году.
Соответственно, действительно легко выбрать блок книг одного автора,
или блок книг одного автора за определенный год.
Но вот книги одного и того же года разбросаны по разным авторам.
И системе управления базой данных пришлось бы либо брать блоки
всех авторов и смотреть в нем все книги за определенный год,
либо просто не использовать этот индекс, и как правило, базы данных так и делают.
Мы можем создать также и наоборот индекс по году, а потом по автору.
Тогда книги будут упорядочены по году, а внутри одного года — по автору.
Таким образом по этому индексу будет легко найти все книги, выпущенные за один год,
и все книги определенного автора, выпущенные за один год,
но при этом не так просто найти книги просто какого-то автора за все года.
Соответственно, база данных, как правило, тоже не будет использовать такой индекс,
если мы захотим найти просто книги автора.
Мы можем создать ведь и просто два раздельных индекса: по автору и по году.
Вообще индексов у таблицы может быть сколько угодно,
но у индексов есть и минусы.
Индекс ускоряет поиск, но не делает это бесплатно.
Он замедляет модификацию данных, потому что требует время на свое обслуживание.
То есть если вы добавите строки, удалите строки или измените какие-то строки,
данные которых используются в этом индексе,
индекс будет вынужден перестроиться.
Это займет какое-то время, хотя и не очень большое.
К тому же индекс занимает место на диске и в памяти.
Соответственно, когда вы создаете индексы, вам нужно подумать,
действительно ли он вам нужен, потому что он ускоряет поиск, но не задаром.
Также индекс может быть уникальным.
Такой индекс отличается от обычного тем, что он не только упорядочивает данные,
но еще и запрещает два одинаковых значения в том поле, по которому построен индекс.
Это может помочь нам контролем целостности.
То есть если дубли в каком-то поле нежелательны,
мы можем сделать по нему уникальный индекс,
и тогда мы не сможем вставить две строки с одинаковым значением этого поля.
Это бывает очень удобно.
Например, первичный ключ является уникальным индексом.
Первичный ключ — это то уникальное значение,
которое идентифицирует строку в таблице.
Конечно, не может быть два одинаковых значения первичного ключа,
иначе мы бы не смогли различить две разные строки.
К тому же по первичному ключу, как правило, нужен индекс, потому что...
чтобы по нему быстро найти строку.
Вот таким образом в этом видео мы поговорили об индексах, узнали о том,
что они бывают простые и составные, о том, что индексы существенно ускоряют поиск,
но при этом не делают это бесплатно, а делают это за счет некоторого замедления
операций изменения данных и расхода дополнительной памяти.
Также индексы бывают уникальные, которые помимо ускорения поиска еще и
позволяют контролировать целостность, исключая дубли там, где они нежелательны.
А в следующем видео мы поговорим о нереляционных или NoSQL базах данных.
[ЗВУК] [БЕЗ_ЗВУКА]