Боязнь индексов – это паранойя

Мне тут довелось общаться со специалистом по базам данных MS SQL Server и из разговора вышло, что он противник индексов. По его мнению, индексы – это практически зло, потому что они замедляют вставку и обновление данных. 

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

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

Опять же, приведу пример со своей предыдущей работой – SonyRewards. Это сайт, на котором раньше были игры Wheeloffortune (в России это поле чудес) и Jeopardy (что-то типа умников, забыл, как в России называется подобная игра). За каждый ответ в игре довались поинты и вопросы в игре были такие же, как и в телевизионной. В общем, как только телевизионная передача заканчивалась, зрители могли пойти на сайт и ответив на вопрос получить 10 поинтов (10 центов в кошелек, который можно было использовать тут же на сайте). Сейчас поинты уже не даются за wof, а игру jeopardy закрыли уже года 4 назад. 

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

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

К чему я это? Не бойтесь создавать индексы. Если на таблице больше select запросов, чем вставки данных, то пользы от них больше, чем вреда. 


Комментарии

Kastor

Что-то я уже не первый раз от Михаила тут читаю о перлах местных специолистов. Задорнов был таки прав?

Иван

Kastor
Не совсем. Один человек взял болт с гайкой и долбил его до посинения, до пенсионного возраста, а другой человек долбит ключ к этому болту. Потом годам к пятидесяти их столкнули лбами.... Так рождаются открытия. И рожденные нобели не в пользу России.
Каждый несет свОй чемодан.

Олег

А как без индексов жить? это вообще реально на более менее больших таблицах (при условии, что нет NoSQL) ?


Добавить Комментарий

О блоге

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

Обратная связь

Без проблем вступаю в неразборчивые разговоры по e-mail. Стараюсь отвечать на письма всех читателей вне зависимости от страны проживания, вероисповидания на русском или английском языке.

Пишите мне