Что такое индексы в базе данных? Почему успешные программисты не могут обойтись без них?
Существует небольшая, но крайне значимая технология, о которой умалчивают многие опытные разработчики. Этот маленький деталь, который часто упускается в процессе обучения, является неотъемлемой частью современных информационных технологий. Речь идет об индексации данных в базах данных. Благодаря этому "мелочному" аспекту мы можем наслаждаться мгновенной работой информационных технологий. Что такое индексы, почему они настолько важны и необходимы? Давайте разберемся в этом вопросе!
Как вы, возможно, уже поняли, данная статья является продолжением предыдущих материалов о системах управления базами данных. Индексы - это неотъемлемая часть СУБД. Этот механизм является одним из увлекательных, важных и крайне полезных инструментов, который активно функционирует в каждой СУБД. Благодаря этому простому, но весьма эффективному изобретению, СУБД успешно обрабатывает огромные объемы информации, а веб-сайты загружаются практически мгновенно - вместо долгих секунд или минут ожидания.
Представьте себе, если бы вам приходилось ждать 1 минуту, 5 минут или даже 20 минут, чтобы загрузить страницу в Telegram или прочитать Дзен. Вряд ли вы бы продолжали пользоваться этими сервисами! Именно поэтому индексы были разработаны - чтобы обеспечить мгновенную загрузку страницы вместо долгих минут или часов ожидания.

Почти в каждой крупной СУБД присутствует механизм индексов. Индексы настолько важны, что их отсутствие в системе или базе данных скорее является исключением, чем чем-то осознанно необходимым. Современные компьютерные системы всегда проектируются с учетом запросов на высокую скорость и обработку больших объемов данных. Индексы созданы и постоянно совершенствуются для того, чтобы пользователи могли эффективно работать с базами данных на высоких скоростях.
В далеком прошлом, в эпоху зарождения компьютерных систем, проблема быстрого доступа к информации не существовала. Объем данных был невелик, и весь интернет мог уместиться на современной флешке. Поиск нужной информации в базе данных путем перебора считался нормой. Однако с течением времени и взрывным ростом объема данных возникла необходимость ускорения алгоритмов поиска. Так появились более сложные методы, такие как индексирование.Важно отметить, что процесс поиска информации не ограничивается лишь "текстовым поиском" в поисковых системах, например, когда мы ищем рецепты вкусных блинов в Яндексе. Любое извлечение информации из базы данных можно рассматривать как форму поиска. Например, когда вы заходите на страницу статьи в Дзене, обратите внимание на уникальный URL этой страницы. Для того чтобы показать вам полный текст статьи, Дзену необходимо найти соответствующую запись в базе данных по URL, по которому вы перешли. Среди огромного количества статей алгоритм быстро находит нужную статью, осуществляя поиск по текстовой ссылке за доли секунды.
В общем, дело в том, что без использования индексов в базах данных современный мир и крупные IT-системы просто остановятся. Ряд обычных операций, которые обычно занимают считанные секунды, начнут занимать минуты или даже часы. Поэтому необходимо уметь создавать и применять индексы, без них никуда. Сегодня мы рассмотрим этот вопрос более подробно.
Что же такое индексы? 🤔
Представь себе книгу по экономике, объемом в 500 страниц. На каждой странице содержится ценная информация - экономические данные, формулы, числа. Теперь представь, что тебе необходимо найти в этой книге "формулу для расчета амортизации". Для этого у тебя есть два основных способа: либо просматривать все страницы по порядку, либо воспользоваться оглавлением. Первый вариант представляет собой линейный поиск, а второй - поиск через индекс.

Проще говоря, индексы - это удобное средство навигации в информационном массиве. Вместо того чтобы просматривать все данные при поиске нужной информации, можно воспользоваться индексом, который позволяет быстро найти нужные данные. В отличие от обычного оглавления, где хранятся только заголовки или краткая информация, проиндексированные данные представлены более подробно, но в компактном формате.
Индексы - это эффективный способ поиска данных, который значительно превосходит линейный перебор. В общем, любая база данных представляет собой упорядоченное хранилище информации, подобное таблице Excel, где данные располагаются последовательно. Представь себе любую программу или социальную сеть с профилями пользователей. Когда кто-то заходит на страницу определенного пользователя, программа должна быстро найти информацию о нем в базе данных и отобразить ее на странице. В случае крупных информационных систем линейный поиск становится слишком медленным, поэтому разработчики прибегают к использованию индексов.
Техническая часть индексов ⚙️
По сути, индексы обычно представлены в виде древовидной структуры. Хотя это может показаться сложным, с практической точки зрения это довольно очевидный и логичный подход. Давайте попробуем разобраться в этом вопросе.
Представь себе, что у тебя имеется файл Excel под названием "пользователи", в котором содержится столбец "возраст пользователя". Внутри этого файла находится целых 100 тысяч записей. Для того чтобы отыскать всех пользователей с возрастом 23 года, при использовании линейного поиска потребуется выполнить 100 тысяч "сравнений" между возрастом 23 и значением "возраст" в каждой строке. Теперь представь, что вместо столбца с возрастом у тебя есть волшебное "дерево". В этом дереве аккуратно упакованы данные о возрасте пользователей, и вместо 100 тысяч сравнений тебе нужно совершить всего 5-10 действий. Чувствуешь разницу в скорости? Именно для достижения такого значительного увеличения скорости используются "деревья".

Представь себе ситуацию, когда ты стоишь перед настоящим деревом с разноцветными листьями. У каждой ветки этого дерева есть свои листья. Если мы хотим достать определенный лист, который нам особенно понравился, нам не нужно лезть на каждую ветку. Достаточно просто пройти по стволу, затем перелезть на нужную ветку и взять нужный лист. Вот в чем суть древовидного хранения - мы знаем, какой лист нам нужен, и идем по самому короткому пути, чтобы его достать.
Вернемся к техническому миру, где дерево представляет собой абстрактное понятие. Рассмотрим пример с таблицей "возрастов". Каждая ячейка с информацией о возрасте ассоциируется с условным "листом дерева", от которого отходят две ветки. Левая ветка указывает на другой лист в случае, если значение меньше текущего. Правая ветка указывает на третий лист, если значение больше предыдущего. Все значения возраста анализируются один раз и преобразуются в такую "шаровидную" структуру, где каждый отдельный лист с определенным возрастом позволяет нам двигаться либо влево - если мы ищем возраст меньше текущего, либо вправо - если мы ищем возраст больше текущего.
В итоге, дерево способно находить любое значение за 5-7 операций сравнения. Это значительно эффективнее, чем простой перебор всех элементов в столбце. Практически это выглядит следующим образом:

В этом примере цифры упакованы в дерево, однако следует помнить, что тексты также подчиняются этим же правилам. В конечном итоге, любой текст представляет собой набор символов, а каждый символ - это набор цифр. Следовательно, их можно эффективно организовать в структуру дерева.
Кто придумал деревья данных? 🌳
Трудно определить точно, кто изобрел деревья данных, поскольку они использовались для визуализации информации уже давно. Например, существует диаграмма в форме дерева, которая датируется 1754 годом (она представлена на одной из страниц старой бумажной Энциклопедии).

Чтобы узнать, когда деревья появились в мире компьютеров, стоит обратить внимание на B-деревья. Они получили свое название (по одной из версий) из-за того, что буква B означает "сбалансированные" (balanced). Суть таких деревьев заключается в том, что они автоматически поддерживают баланс при добавлении новых данных.
B-деревья были придуманы Рудольфом Байером и Эдвардом М. МакКрайтом во время работы в исследовательской лаборатории компании Boeing. Эта структура была разработана для эффективного управления индексными страницами больших файлов с произвольным доступом, что помогает ускорить поиск информации. Интересно, что идею индексации данных через "деревья" придумали внутри компании, специализирующейся на самолетостроении.Итак, основная гипотеза ученых заключалась в том, что индексы будут настолько большими, что оперативная память сможет вместить только небольшие части построенного дерева. Статья Байера и МакКрайта "Организация и обслуживание больших упорядоченных индексов" была впервые опубликована в июле 1970 года и позднее опубликована в журнале Acta Informatica. Для тех, кто заинтересован, вот ссылка на оригинал этой статьи. К счастью, первоначальная гипотеза о "огромном размере" деревьев оказалась ошибочной, и новая структура данных постепенно распространилась по всему миру - ее быстро приняли все крупные разработчики СУБД.

Интересно, что Байер и МакКрейт так и не раскрыли смысл буквы B в термине B-деревья, если таковой вообще имеется: Предложены были различные варианты для обсуждения - Boeing, balanced, between, broad, bushy и Bayer. МакКрейт отметил, что "чем больше вы задумываетесь над значением B в B-деревьях, тем глубже вы погружаетесь в суть B-деревьев". В общем, такова их история.
К слову, МакКрейт имеет веб-сайт, где он открыто заявляет, что не раскроет секрет, почему Б-деревья получили именно такое название (смешно). Доказательство - ссылка на страницу. На главной странице сайта можно найти его адрес электронной почты.
Индексы в различных СУБД 🐬
Примером простой задачи является работа с индексами в MySQL. Как упоминалось ранее, эта система управления базами данных является классикой в веб-разработке и широко используется на множестве веб-сайтов. Индексы в MySQL можно обнаружить практически на всех сайтах, построенных на CMS Wordpress, что составляет целых 43% от общего числа веб-ресурсов в мире. Несмотря на то, что развитие MySQL в настоящее время происходит медленнее, чем у PostgreSQL, её значимость остается очень высокой.
Если вы успешно создали базу данных MySQL на своем компьютере и подключились к ней через MySQL Workbench, то управление индексами можно осуществить в разделе управления таблицей, во вкладке "Индексы". Чтобы попасть туда, щелкните правой кнопкой мыши и выберите "ALTER TABLE" в открывшемся меню. Затем перейдите на вкладку Indexes - здесь происходит создание новых индексов и управление уже существующими.На изображении ниже показан список таблиц в базе данных, расположенный в левой части экрана. Для создания нового индекса необходимо выбрать определенную таблицу, щелкнуть правой кнопкой мыши и выбрать "ALTER TABLE". В центре экрана появится возможность выбрать имена для новых индексов и определить столбцы, для которых они будут созданы. В правой части экрана можно выбрать тип индекса (например, самый простой - BTREE). После выполнения необходимых действий следует нажать "Apply" - команды будут отправлены на сервер СУБД, и система начнет процесс создания нового индекса.

После выполнения вышеуказанных действий, MySQL автоматически просмотрит весь столбец с данными и сформирует "дерево", в котором будут содержаться ссылки на реальные данные из таблицы. Следовательно, поиск данных по столбцу будет осуществляться через это "дерево", а не путем последовательного перебора всех значений.
Даже при наличии нескольких миллионов строк в таблице, операции поиска по индексу будут занимать всего несколько секунд или даже долей секунды. Создав индекс, вы автоматически запустите его функционирование, и вам не потребуется повторно его настраивать. После каждой операции вставки данных индекс будет автоматически перебалансироваться для поддержания высокой скорости поиска информации.
Использование индексов - это хорошая практика 👨💻
Использование индексов в базе данных - это важное правило, свидетельствующее о профессионализме разработчика. Практически все крупные проекты и их базы данных требуют наличия индексов. При проектировании системы необходимо задуматься о производительности и применить механизм индексации.
Представьте себе веб-сайт, на который одновременно заходит несколько тысяч пользователей. Каждый из них ищет ответ на свой вопрос, каждый из них стремится решить свою проблему. Для посетителей важна скорость получения информации, а не столько внешний вид или структура сайта. Чем быстрее пользователь найдет нужную ему информацию, тем приятнее, удобнее и проще будет его опыт. Поэтому использование индексации имеет весьма положительную цель - ускорить процесс поиска нужной информации для пользователей.
Также стоит отметить, что индексы не всегда необходимы. Например, если в вашей таблице содержится от 5 до 100 строк, то более эффективным будет использование линейного поиска информации, так как он работает быстрее. Однако, если количество данных превышает 1-2 тысячи строк, то использование индексов становится более предпочтительным вариантом.
В общем, если использовать индексы, то программа будет работать быстрее, а СУБД будет эффективнее.

🔥 Нравится? Подпишись! Вместе мы одержим победу над восстанием роботов! 🔥

🚀 P.S. Поддержи меня и мой проект "Войти в IT" на платформе boosty! Там я выкладываю более уникальный и профессиональный контент, иногда даже немного личный. Хочешь увидеть меня в реальной жизни? Тогда переходи по ссылке: Ссылка 🚀
Кстати, у меня также есть канал в Telegram. Там публикуются посты немного проще и веселее. Вот ссылка
Comments