2012-05-02 36 views
9

W porządku, więc buduję aplikację opartą na Node.js i używam mangusty do obsługi mojego połączenia z mongodb. Mam punkt końcowy, który jest taki:Dlaczego mój mongodb nazywa się tak wolno?

getTestStream : function(req, res, conditions, callback) { 
    Activity.find() 
    .limit(1000) 
    .run(function(err, activities) { 
     if (err){ 
     util.sendError(req, res, "Query Error", err); 
     } else if (activities) {  
     res.send(activities); 
     } else { 
     util.send('nope'); 
     } 
    }); 
} 

Z jakiegoś powodu ta rozmowa trwa 700ms +. To samo połączenie bez zastosowania limitu z powłoki mongody powraca w około 4ms. Wygląda na to, że jest to takie proste zapytanie, więc co go tak spowalnia? Zgaduję, że przegapiłem coś oczywistego w konfiguracji, ale nie mam pojęcia.

Dziękuję każdemu, kto może w tym pomóc.

Inne info:

[email protected] 
[email protected] 
[email protected] 
+0

nie jestem bardzo obeznany z mangusta, więc jest to po prostu strzał w jaśniejszych Czy trzeba podać swój limit przed komendą znaleźć? Ponieważ może to wyjść i pobrać rekordy od razu w find(), a następnie próbujesz w jakiś sposób go ponownie ograniczyć? Wygląda to nieco podobnie do twojego pytania: http://stackoverflow.com/questions/5539955/how-to-paginate-with-mongoose-in-node-js –

+0

Modyfikowanie zapytania w celu uwzględnienia limitu w następujący sposób nie wpływa na wydajność jakikolwiek oczywisty sposób. Activity.find ({}, {limit: 1000}) .run (funkcja (err, activities) { –

+0

Jak duże są twoje dokumenty? Czy możesz opublikować db.coll.stats(). –

Odpowiedz

9

Po eksperymentach na chwilę, Znalazłem kilka składek na powolność, z nadzieją, że to pomoże ktoś z podobnym problemie:

  • Przedmiotem mam wnioskujące są duże, więc przetwarzanie ich zajmuje trochę czasu. W przypadku dużych obiektów zmodyfikuj zapytanie, aby zwracać tylko te pola, które są obecnie potrzebne: .
  • Mongoza jest przydatna, ale może naprawdę zwolnić, gdy zażądasz wielu przedmiotów, lepiej jest po prostu bezpośrednio połączyć się z węzłem-mongodb-native, jeśli chcesz przyspieszyć połączenie. (To było około 50% + wzrostu prędkości dla mojego scenariusza)

Korzystając z tych technik, mogę teraz przetworzyć 4000 rekordów w krótszym czasie niż przedtem. Dziękuję wszystkim, którzy skomentowali, i specjalne podziękowania dla Gates VP za wskazanie, że mangusta nie pasowała do tego typu połączeń.

+1

Jak duże były obiekty, o które pytałeś? Byłoby miło z grubsza zorientować się, jak duży może być obiekt, aby spowodować problem z perfekcją, który widziałeś. –

+2

Nie były ogromne, od jakiegoś czasu zajmowałem się tym zagadnieniem, prawdopodobnie czterema polami ciągów po 50-100 znaków. Należy pamiętać, że teraz mangusta ma opcję [lean()] (http://mongoosejs.com/docs/api.html#query_Query-lean), która usuwa większość nadlewek getter/setter, a także [stream()) ] (http://mongoosejs.com/docs/2.7.x/docs/querystream.html) funkcja, dzięki której można uzyskać wyniki, gdy zostaną znalezione. –

+0

Dzięki za napiwek dla chudego. Aktualnie pobieram ~ 280 rekordów, ale są one zagnieżdżone na wielu poziomach, z kilkoma pod-dokumentami mającymi 200 elementów. Potrwało to moje monotonne zapytanie z 2,5 sekundy do 15 ms (właśnie to dostałem w powłoce mongo). – Leonidas

0

To samo wezwanie, nawet bez stosowania limitu zwrotu MongoDB wykonaną z muszli około 4ms.

Powłoka domyślnie stosuje limit 30 dni. Spróbuj wykonać z powłoki z rzeczywistym limitem?

Możesz również wypróbować .explain() ze skorupy.

Jeśli nic z tego nie działa, możesz wziąć propozycję @Kyle Banker i sprawdzić the profiler.

+0

Nie wydaje się niewdzięczny, ale problem nie leży w mongodb. Jak napisałem w innym komentarzu powyżej: "Jeśli uruchomię db.activities.find(). Limit (1000) .explain() wewnątrz konsoli/powłoki mongo, zapytanie zajmuje mniej niż 5 milisekund." Profiler pokazuje te same wyniki dla prawdziwych wywołań z punktu końcowego. Zakładam, że jest to konfiguracja sterownika lub coś związanego z opakowaniem mangusty, ponieważ do tej pory nie znajduję żadnych wad części mongodb. –

+1

Więc edytowałem tagi i dodałem Mongoose. Jeśli nie otrzymasz odpowiedzi tutaj, zdecydowanie sprawdzę ich Grupę dyskusyjną Google. Zauważ, że Mongoose * to * budowanie obiektu do zawijania wokół każdego wyniku, który wyciągasz z DB. Jest więc całkiem możliwe, że Mongoose nie jest po prostu zoptymalizowany. –

+0

Ach, dobre połączenie. Myślałem, że dodałem mangustę, ale najwyraźniej nie. Przetestowałem tę samą funkcję z różnymi (mniejszymi) obiektami bazy danych w innej kolekcji i wydaje się, że jest około 100 ms szybsze, więc może bezpośrednio odnosić się do tego, jak złożony jest rekord db, ile czasu zajmuje mongoose do zawijania każdego rekordu przy pobieraniu. –

Powiązane problemy