Задать вопрос
@psychedelicGeek
Любитель программировать

Кто нибудь объясните мне про индексы в БД, я не вижу в них никакого смысла?

Начну с того что понимание зачем индексы для БД у меня имеются, но я не понимаю в них смысла.
В ChatGPT+Copilot я задавал вопрос, а смысла в индексах, если ты все равно при разработке проекта не можешь знать, какие данные будут самыми запрашиваемые для редактирования или для запросов.

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

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

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

Есть ли вообще ситуации, когда при WHERE, ORDER BY, JOIN, MIN, MAX, COUNT и прочих таких функциях базы данных, даже при огромной нагрузке на БД, база данных отлично справлялась и без всяких индексов?
  • Вопрос задан
  • 33062 просмотра
Подписаться 2 Простой 5 комментариев
Решения вопроса 8
@multisu
Вопрос бы переформулировать. Не нужны ли индексы, а сколько надо индексов.
По своему опыту.
1 индекс на таблицу обязательно. Даже если в запросе нет условия по индексу, план выполнения строится оптимальнее, запросы работают быстрее.
А вот больше уже сильно зависит от используемой БД и самого использования. С pg например столкнулся с ситуацией, когда второй индекс сильно замедляет операции вставки и удаления. При этом этом селекты выполняются незначительно медленее. И если сравнивать организацию индексов в pg и mssql, то можно даже найти объяснения, почему то, что хорошо работало в одной БД, плохо работает в другой.
Ответ написан
@AKimovd
Индексы нужны, но не всегда и не всем.
При разработке вы действительно точно не можете спрогнозировать нагрузку на БД. Но точно и не нужно. Как правило разработчик знает свое приложение, и какие данные из БД ему нужны. Соответственно знает предикаты (блок WHERE), которые будут в тех или иных запросах. Далее, входе разработки, когда будет накоплена некоторая статистика по наиболее востребованным предикатам, можно будет уже продумать какие индексы нужны.
В ходе реальной эксплуатации приложения, даже просто у разных клиентов может возникнуть ситуация, когда у одного все хорошо, а у другого тормозит. Все зависит от профиля нагрузки и наполнения таблиц. Бывает, что таблица DML-нагружена (много изменений) и имеет много индексов - будут тормоза, связанные с дополнительной работой по поддержания индексов в актуальном состоянии. А если ещё и много ограничений целостности...
Второй вариант, когда у одного клиента таблица на 1к строк и ему хорошо без индексов, даже если таблица "горячая" по чтениям. БД просто держит её всегда в кэше.
У другого клиента эта же таблица содержит 100к записей и ему ну очень нужны какие то индексы.
Ситуация когда данные в таблице часто меняются и часто и много запрашиваются, как правило связанны с не верной архитектурой приложения. Тут нужно уже переделывать.
Ответ написан
@diman2000
Ну как минимум чтение индекса при поиске обходится намного дешевле, чем чтение всей таблицы. Банально меньшее кол-во данных надо прочитать. Тем более индексы - упорядоченная структура, для поиска данных по какой-то колонке не надо читать весь индекс. Можно сравнить b-tree индекс с алфавитным указателем - чтобы найти в нём ссылку на какое-то слово, не надо читать весь алфавитный указатель, надо просто перейти к нужной букве.
Но да, не каждый индекс может быть полезен. Есть такое понятие, как селективность индекса. Условно, индекс по полю "пол" реально может не давать пользы, так как даже при использовании индекса так и так надо будет прочитать половину записей в таблице и может быть быстрее просто прочитать всю таблицу.
Рекомендую прочитать книги, например, я читал "Настройка производительности MySQL" Нихтера. Тогда всё станет ясно.
Ответ написан
@ostap-shut
Ответ очень прост. Смотришь сколько идёт ли поиск по полю, если медленно то ставишь индекс все.
Для определения быстро или медленно. Тоже легко если таблица миллион плюс записей будет то сразу да, если нет смотришь требования, запрос должен происходить максимально быстро то ставишь индекс(к примеру часто используется в подзапросе) , если не важно то не ставишь. Все весь алгоритм.
А вообще чтобы понять требуется индекс или нет смотришь сколь вообще идёт запрос в веб если он идёт в районе 1 секунды то все ок, если нет ищешь способ ускорить, сам простой способ проиндексирвать на поля по которым идёт поиск.
Так же индекс не имеет смысла ставить на поле, если ты перед этим будет фильтр, который уменьшить выборку до 10-20 значений.
К примеру у тебя в таблице, хранятся ид пользователя и его адрес. По ты точно знаешь, что только по адресу поиск не производиться, то можно фильтрануть по ид пользователя, а потомм по адресу, а адресов больше 100 99% не имеют. Тут индекс не нуден
Ответ написан
@iAVKi
Когда ты связываешь две таблицы по полю, то поле второй таблицы должно быть проиндексировано для мгновенного доступа, чтобы это поле могло быть отображено рядом. В FoxPro это наглядно видно. Поэтому сначала надо подумать, сделать архитектуру, а потом писать. Но так не всегда получается, и приходится добавлять индексы "на живую" под вновь появившуюся хотелку. В общем индексы нужны для быстрой связи между БД.
Ответ написан
@luckman
Таблица без индексов это как Array либо List объектов. Каждый новый индекс добавляет хранение этих объектов в Map (Dictionary) где key мапы это index key, а value это строка.

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

Для некоторых сложных индексов по нескольким полям иногда нужно замеры проводить. (По типу, если есть индекс с 3 полями, а ты ищешь по 4 полям, и не знаешь, что будет лучше, добавить новый с 4 полями, или продолжить использовать имеющийся с 3 полями)
Ответ написан
Комментировать
@Vitsliputsli
Если очень кратко:
Вам нужно понять, что индексы это не такая уж элементарная вещь. Нельзя просто поставить на поле флажок "индексировать". Индексы это тонкая настройка, и чем сложнее выборки, тем она сложнее. Даже не рассматривая различные типы индексов, выбрать какие поля, в какой последовательности, с какой сортировкой и в каком индексе должны присутствовать бывает не так просто. Для этого нужно очень хорошо понимать и как устроены индексы, и как с ними будет работать оптимизатор и какова селективность конкретных данных. И тогда, скорость выборок можно увеличить в разы, но все это конечно не бесплатно.
Тем не менее, другой ваш вопрос, если нужно фильтровать и сортировать по всем полям таблицы, а полей очень много, здесь уже использование реляционных СУБД не оправдано и на помощь приходят другие инструменты, типа ElasticSearch.
Если заботитесь о стабильности, то индексы всегда назначаются при разработке соответствующих запросов. Если потом мы их и меняем, то потому что чтото не предусмотрели.
Индексы могут замедлить работу. Очевидно, что они замедляют вставки и апдейты, но при криворукости можно замедлить и выборки, ведь и оптимизатор тоже ошибается. Индекс это по сути еще одна таблица, что уже намекает что не всегда это будет быстрее, т.к. придется работать не с одной таблицей, а с двумя (не всегда с двумя, но опять же, в двух словах все не охватишь).
Ответ написан
Комментировать
LaRN
@LaRN
Senior Developer
Можно попробовать порешать задачи на codeforces, сразу станет понятно, что перебор по массиву, даже не очень большому и двоичный поск по сортированному могут в сотни раз по времени отличатся хотя тут все данные в оперативке, а в реальной БД почти все на дисках, часть только горячих данных в кеше в оперативке.
Ответ написан
Пригласить эксперта
Ответы на вопрос 7
xez
@xez
TL Junior Roo
Вот вам христоматийная задача - у вас есть телефонный справочник города вида ФИО - номер телефона.
В справочнике 1М+ записей.
Вам нужно найти номер телефона по имени.
Сколько вам потребуется времени на поиск по несортированному, неиндексированному списку в худшем случае?

Надеюсь, вопросов насчет необходимости индексов БД у вас не осталось.
Ответ написан
GavriKos
@GavriKos
если ты все равно при разработке проекта не можешь знать, какие данные будут самыми запрашиваемые для редактирования или для запросов.

Почему это не знаешь? Это вполне себе анализируется на этапе бизнес-требований. Конечно потом индексы можно и нужно пересматривать, но и в начале вполне это может быть понятно исходя из ТЗ.

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

В век быстрых компьютеров еще и растет само по себе количество информации. И потребность оптимизации никуда не делась. К тому же - это бизнес - так что если добавив индекс можно сэкономить на инфраструктуре - то кнчн лучш едобавить индекс, а не вкидывать бабки в дорогое железо.
Ответ написан
Комментировать
@KVadikWOT
Ну если у автора "базы" максимум по десятку записей в таблице, и у баз единицы юзеров, то индексы ему и не нужны. В остальном вопрос настолько глупый, что я даже не знаю что сказать, я не смогу опуститься до такого уровня.
Ответ написан
Комментировать
mitaichik
@mitaichik
Похоже, вы совсем новичек, если считаете что оптоволокно здесь хоть что то ускорит.

С правильным индексом на приличной базе выполнение запроса ускоряется в сотни раз. Это все что нужно знать для начала

За более подробным ответом идти надо не на форумы, а в документацию используемой вами бд. Там будет подробно все расписано, а в профильных книгах будет информация как они строятся, и работают внутри.
Ответ написан
Комментировать
@igaraev
Индексы точно нужны. Даже если вся таблица будет в оперативной памяти, поиск по индексу все равно будет быстрее.
Ответ написан
@Gizcer
Если не знаешь зачемм, то протестируй. Сделай замеры скорости обработки и увидишь разницу.
Ответ написан
@cstrike
Был у нас запрос который занимал 10 сек. После добавления правильного индекса он стал выполняться за 5мс. Скорость интернета здесь ни причем. Это время поиска информации в ДБ а не время передачи данных.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы