Обзор MongoDB: преимущества и недостатки
Сегодня за 2 часа написал великолепнейшую RSS-читалку. На Ruby. Web-фреймворк — Sinatra. База данных — MongoDB.
О впечатлениях от Монги и хочу рассказать. Работать с этой СУБД невероятно приятно и легко. Никаких таблиц, схем и миграций. Пришел. Увидел. Закодил.
Например, вот как выводится список последних 100 новостей, отсортированных по времени:
get '/news' do
news = db.collection('news').find.sort(:ts => :desc).limit(100)
erb :news,
:layout => :layout,
:locals => {
:title => ‘Новости’,
:news => news
}
end
В хэше news уже содержатся заголовки, описание, дата, теги, примечания и т.п. В шаблоне остается запилить перебор и отображение всех элементов news. Поскольку нет нужды продумывать нормализацию данных в БД и потом выдумывать всякие хитрожопые джоины, читалку удалось написать за пару часов. И это с Аяксом и прочими модными украшательствами. Я очень доволен.
Потом вдруг решил прогнать тесты на производительность. Тут вся эйфория и улетучилась. ab -c 100 -n 10000 показал всего 140 запросов в секунду. Это при том, что статика на этом же сервере выдается со скоростью 8300 запросов в секунду, а MySQL/PHP в похожих условиях выдает 3500 запросов в секунду. Но даже не это больше всего расстроило. Зацените потребление ресурсов. Напомню, это все тратится на «детскую» нагрузку в 140 страниц в секунду на компе с i5 и 4 Гб ОЗУ:
2238 mongodb 20 0 509m 40m 11m S 96,0 1,1 3:07.02 mongod
8224 architec 20 0 111m 38m 2180 S 47,8 1,0 0:11.05 ruby
8216 architec 20 0 111m 38m 2216 S 43,5 1,0 0:10.64 ruby
8239 architec 20 0 113m 40m 2184 S 42,5 1,0 0:10.27 ruby
8207 architec 20 0 111m 38m 2196 S 41,2 1,0 0:10.95 ruby
7052 architec 20 0 175m 41m 2220 S 40,8 1,1 1:10.84 ruby
8232 architec 20 0 111m 38m 2240 S 40,5 1,0 0:10.60 ruby
6013 root 20 0 120m 6308 3268 S 17,6 0,2 0:37.84 PassengerHelper
7296 www-data 20 0 362m 5192 1676 S 6,0 0,1 0:02.48 apache2
7997 www-data 20 0 362m 4984 1580 S 5,6 0,1 0:02.44 apache2
8078 www-data 20 0 426m 4972 1580 S 5,6 0,1 0:02.17 apache2
Узкое место — Mongo. Что имеем:
1. MongoDB — прекраснейшая СУБД, программировать под которую одно удовольствие.
2. MongoDB не всегда годится на роль замены MySQL. Особенно, если ваш web-проект не предусматривает выделение под MongoDB двух и более отдельных серверов (есть мнение, что только в такой конфигурации начинает раскрываться весь вычислительный потенциал Монги).