Ускоряем поиск при помощи NoSQL
Как ускорить поиск структурированых данных?
Первое, что приходит в голову - это увеличить количество серверов обслуживающих базу данных, то есть банально реплицировать данные на n серверов и забирать их через балансер нагрузок. Казалось бы, что все просто: берем тот же pgpool-II и в бой. Как показала практика, толи у админов, толи у наших программистов, которые пишут десктопную админку, что то не заладилось, сказали вон то и вот это не реплицируется. И сели все ждать postgresql 8.4, а теперь и 9. Как-то пришла мысль, что раз у нас уже используется MongoDB для небольших задач, то почему бы не попробовать поиск переложить на ее плечи?!
Подумано - сделано.
Самое трудоемкое было написать словари настройки, по которым выбирались данные. Функция сброса дынных запускалась асинхронно по «сигналу»1 сохранения объекта. Для подстраховки написал еще парочку функций запускаемых по cron’у, которые искали потерявшиеся объекты и чистили базу mongo от устаревших и не участвующих в поиске объектов. Да еще и функция поиска сократилась в разы по своей длине.
Благодаря MongoDB поиск стал «моментальным». К сожалению, никаких цифр сейчас привести не могу, но разницу в скорости поиска все увидели и без измерений. Осталось вылизать весь функционал и можна смело отправлять в продакшин.