MongoDB

AB
  • Rejestracja:prawie 9 lat
  • Ostatnio:ponad 8 lat
  • Postów:229
1

Czy jest na grupie ktoś kto ma doświadczenie z MongDB? Jeśli tak, to bym prosił o kilka zdań na temat wydajności tej bazy. Naprawdę można uzyskać duże
przyspieszenie względem takich baz jak postgres czy mssql?

Pozdrawiam

katelx
  • Rejestracja:prawie 10 lat
  • Ostatnio:4 miesiące
  • Lokalizacja:Hong Kong
1

niestety nie ma jednoznacznej odpowiedzi na twoje pytanie. to tak jak bys sie spytal czy lepsza jest java czy c albo windows vs linux.
podaj przypadek uzycia i co wlasciwie chcesz przyspieszyc, o ile i dlaczego. w innym wypadku nie ma sobie co zawracac glowy (chyba ze robisz to w celach edukacyjnych).

Julian_
lepsza jest Java od C, a od Javy R, bo najlepszy.
katelx
najlepsze to sa twoje teksty, wciaz tak swieze i zabawne
vpiotr
Długo nad tym myślał...
AB
  • Rejestracja:prawie 9 lat
  • Ostatnio:ponad 8 lat
  • Postów:229
0

Właśnie ja pytam o sensowne przykłady użycia. Oczekuję takich przykładowych odpowiedzi. Mieliśmy taką i taką aplikację na takiej bazie. Były takie i takie problemy. Przeszliśmy na MongoDB. Te problemy zniknęły, ale za to takie się pojawiły.

WL
  • Rejestracja:około 21 lat
  • Ostatnio:około 2 miesiące
  • Postów:1082
0

To najpierw zadaj sensowne pytanie, bo to za bardzo nie jest...
Nie da się wprost porównać bazy relacyjnej do NoSQL. Mają różne zastosowania a u ich podstaw leżą zupełnie rożne wymagania.

Skoro nie potrzebujesz w bazie danych transakcji zgodnej z ACID (np. MongoDB nie wspiera two-phase-commit), bez wsparcia dla triggerów i kluczy obcych, bez złączeń, itd. itp. to MongoDB jest dla Ciebie.
Jeśli potrzebujesz dynamicznego schematu bazy danych, bardzo dobrej skalowalności poziomej, obsługi danych zorientowanej na dokumenty, to MSSQL nie jest dla Ciebie.

Przy tradycyjnym podejściu relacyjnym, MSSQL i inne bazy relacyjne będą szybsze i wygodniejsze.
Przy skomplikowanym modelu danych zorientowanym na dokument oraz dynamicznie zmieniającym się schemacie danych, to NoSQL będzie wygodniejszy i szybszy.

KR
Moderator
  • Rejestracja:prawie 21 lat
  • Ostatnio:2 dni
  • Postów:2964
0
wloochacz napisał(a):

Jeśli potrzebujesz (...) bardzo dobrej skalowalności poziomej (...) to MSSQL nie jest dla Ciebie.

Mongo też nie. Nie każdy NoSQL jest wydajny i skalowalny.

Mongo jest jak PHP. Jest oparte na prostej koncepcji, łatwo zacząć zabawę na własnym laptopie, ma niezłą dokumentację, jest popularne, no i nie czepia się takich drobiazgów jak typy danych. Byle gimnazjalista może postawić Mongo i napisać prostą aplikację.

Wszystko jest pięknie do postawienia serwisu produkcyjnie. Wtedy nagle okazuje się, że Mongo nie gwarantuje nawet niezgubienia danych potwierdzonych jako zapisane, konfiguracja Mongo na wielu serwerach już nie jest wcale taka prosta jak na jednym laptopie, wydajność ssie jak tylko dane przestaną mieścić się w RAM, a do tego wcale się nie skaluje tak jak obiecano w ulotce reklamowej.

https://aphyr.com/posts/322-call-me-maybe-mongodb-stale-reads

edytowany 1x, ostatnio: Krolik
AB
  • Rejestracja:prawie 9 lat
  • Ostatnio:ponad 8 lat
  • Postów:229
0

Jakiej skalowalności się spodziewać? WIem że nie ma na to pytanie precyzyjnej i jednoznacznej odpowiedzi, ale chodzi mi o
jakieś szacunki, byle te szacunki były poparte praktyką (nie teorią z dokumentacji).

Mam np. tabelę w porządnej sqlowej bazie. Tabela ma około 20 istotnych pól. Istotne pola to te, po których następuje wyszukiwanie i
indeksowanie. Do tego tabela ma kilka długich pól tekstowych, są w nich dane które tylko są wyświetlane, nie robię na nich
żadnych operacji typ LIKE, REGEXP czy choćby substring. Powiedzmy że złączeń tabel też nie ma.

Dodanie miliona losowych danych do tej tabeli trwa około 40 minut na laptopie. Powiedzmy że teraz to samo chcę zrobić na
MongoDB zainstalowanym na 20 komputerach. Czego się spodziewać? Ile rekordów na ten milion średnio zginie? Ile razy
czas zapisu powinien się skrócić?

Potem wyszukiwanie. Obecnie, na bazie sql, gdy w bazie mam 5mln testowych rekordów i gdy cała baza jest
zbuforowana w RAM, to zapytania typu:
select * from table where pole1=123 and pole2=342 and pole3 <= 1937323 order by pole3 limit 30;
trwa od 3 do 15 ms.
Nawet gdy warunek zawiera dużo operatorów and i or to zapytanie wyrabia się najczęściej w 20ms.

Jednak gdy mam zapytanie typu:
select * from table where pole1=123 and pole2 in ( lista od 10 do 100 intigerów ) and pole3 <= 1937323 order by pole3 limit 30;
To zapytanie trwa już bardzo długo, rzędu 0.5 do 20s, najczęściej 1-4 sekundy.

Gdybym zrobił analogiczne zapytanie na MongoDB skonfigurowanym na 20 komputerach to można spodziewać się
przyspieszenia chociaż 10 razy?

P.S.
Gdy w mojej bazie SQL zabraknie RAM to zapytania też trwają bardzo długo.

LukeJL
  • Rejestracja:około 11 lat
  • Ostatnio:19 minut
  • Postów:8398
0

Do poczytania use case użycia MongoDB, o tym jak gość w prosty sposób zoptymalizował sobie apkę:
https://medium.com/unboxd/how-i-built-an-app-with-500-000-users-in-5-days-on-a-100-server-77deeb238e83#.z1yo1ms5c

TLDR: Apka na MongoDB + Moongoose mu muliła, myślał, że to Moongoose (nakładka na MongoDB) ale okazało się, że musiał dodać wskaźnik lean() na Moongoose, więc morał z tego, że trzeba czytać dokumentację narzędzi, a nie winić narzędzie od razu (tak samo i z MongoDB, MySQL etc. czasem winimy narzędzie, a często po prostu nie umiemy korzystać z danych narzędzi...).

Także zrobił gość bardzo prostą i w sumie durną optymalizację - czyli stworzył dodatkowe kolekcje dla często pobieranych dokumentów, takich jak "all "snaps, most liked snaps, newest snaps, newest valid " i to też mu podobno pomogło zoptymalizować apkę. Czyli wniosek z tego taki, że czasem zamiast zmieniać technologie wystarczy dokonać prostej optymalizacji w ramach danej technologii...

Jakiej skalowalności się spodziewać?

Ale skalowalności do czego? Masz jakiś konkretny use case? Zapytania "coś tam from pole" to nie use case, tylko szczegół implementacyjny...


edytowany 2x, ostatnio: LukeJL
AB
  • Rejestracja:prawie 9 lat
  • Ostatnio:ponad 8 lat
  • Postów:229
0
LukeJL napisał(a):

Do poczytania use case użycia MongoDB, o tym jak gość w prosty sposób zoptymalizował sobie apkę:
https://medium.com/unboxd/how-i-built-an-app-with-500-000-users-in-5-days-on-a-100-server-77deeb238e83#.z1yo1ms5c

Dzięki, spojrzę.

LukeJL napisał(a):

TLDR: Apka na MongoDB + Moongoose mu muliła, myślał, że to Moongoose (nakładka na MongoDB) ale okazało się, że musiał dodać wskaźnik lean() na Moongoose, więc morał z tego, że trzeba czytać dokumentację narzędzi, a nie winić narzędzie od razu (tak samo i z MongoDB, MySQL etc. czasem winimy narzędzie, a często po prostu nie umiemy korzystać z danych narzędzi...).

Czasami owszem nieumiejętnie korzysta się z narzędzi. Teraz mam w bazie jedną istotną/dużą tabelę. Wrzuciłem do testów około
5-6mln rekordów. Jest w tej tabeli około 5gb danych. Bazie przydzieliłem 6GB ram, na lapku jest 12GB ram, system plików jest buforowany.
Wykonałem altertable żeby dodać kolumnę do tej tabeli. Zapytanie trwało 700sekund. No cóż, nie często się doaje kolumny, można
przeżyć. Potem jednak dałem:
update table1 t set nowe_pole = (select pole from table2 where t.id_obce = id);
table2 jest mała, ma 900 rekordów.
Czyli trzeba na dysku zapisać około 20MB danych i około 5 mln razy poszukać wartości w małej tabelce.
Zapytanie trwało 31884s, po czym przerwałem bo mnie ku#$%ca wzięła.
Chętnie bym się dowiedział i zrozumiał co znowu zrobiłem źle. Dlaczego baza sql przez 10godzin ciągłej
pracy nie jest w stanie zapisać 20MB danych na dysku?

LukeJL napisał(a):

Także zrobił gość bardzo prostą i w sumie durną optymalizację - czyli stworzył dodatkowe kolekcje dla często pobieranych dokumentów, takich jak "all "snaps, most liked snaps, newest snaps, newest valid " i to też mu podobno pomogło zoptymalizować apkę. Czyli wniosek z tego taki, że czasem zamiast zmieniać technologie wystarczy dokonać prostej optymalizacji w ramach danej technologii...

Czasami się udaje coś takiego. Zwykle tylko wtedy, gdy są małe wymagania wobec aplikacji.

Jakiej skalowalności się spodziewać?

Ale skalowalności do czego? Masz jakiś konkretny use case? Zapytania "coś tam from pole" to nie use case, tylko szczegół implementacyjny...</quote>
Jeju, nikt na forum nie wrzuci 100 stron dokumentacji, ani nikt za free nie będzie tago nalizował. SQL bardzo precyzyjnie wyraża
co trzeba przyspieszyć. Nie napisałem coś tam from pole, tylko podałem przykładowe warunki i opisałem że jest jedna istotna
tabela. Chciałbym wiedzieć czy odpowiednik takiego selecta w ogóle może się szybciej wykonać na MongoDB i jaki to jest
rząd wielkości np. na 20 komputerach.

Marcin.Miga
  • Rejestracja:prawie 17 lat
  • Ostatnio:3 dni
  • Postów:2792
1
artur_bredzki napisał(a):

Potem jednak dałem:
update table1 t set nowe_pole = (select pole from table2 where t.id_obce = id);
table2 jest mała, ma 900 rekordów.
Czyli trzeba na dysku zapisać około 20MB danych i około 5 mln razy poszukać wartości w małej tabelce.
Zapytanie trwało 31884s, po czym przerwałem bo mnie ku#$%ca wzięła.
Chętnie bym się dowiedział i zrozumiał co znowu zrobiłem źle. Dlaczego baza sql przez 10godzin ciągłej
pracy nie jest w stanie zapisać 20MB danych na dysku?

Nie skorzystałeś z FROM w UPDATE.

Kopiuj
UPDATE table1 SET nowe_pole=x.pole FROM table2 x WHERE x.id_obce=table1.id
AB
  • Rejestracja:prawie 9 lat
  • Ostatnio:ponad 8 lat
  • Postów:229
0
Marcin.Miga napisał(a):
artur_bredzki napisał(a):

Potem jednak dałem:
update table1 t set nowe_pole = (select pole from table2 where t.id_obce = id);
table2 jest mała, ma 900 rekordów.
Czyli trzeba na dysku zapisać około 20MB danych i około 5 mln razy poszukać wartości w małej tabelce.
Zapytanie trwało 31884s, po czym przerwałem bo mnie ku#$%ca wzięła.
Chętnie bym się dowiedział i zrozumiał co znowu zrobiłem źle. Dlaczego baza sql przez 10godzin ciągłej
pracy nie jest w stanie zapisać 20MB danych na dysku?

Nie skorzystałeś z FROM w UPDATE.

Kopiuj
UPDATE table1 SET nowe_pole=x.pole FROM table2 x WHERE x.id_obce=table1.id

A więc...

WL
A więc to zapytanie jest źle napisane.
WL
Doprawdy. A jaka to baza, PostgreSQL? To ja się nie znam, przepraszam :)
AB
Działa tamto zapytanie, sprawdziłem na mniejszej ilości rekordów. Jest poprawne.
katelx
  • Rejestracja:prawie 10 lat
  • Ostatnio:4 miesiące
  • Lokalizacja:Hong Kong
0

gdy nieumiejetnie uzywa sie sql to nieumiejetne uczywanie no-sql nie sprawi ze magicznie wszystko przyspieszy. twoja baza jest bardzo mala, mysle ze najprawdopodobniej jest zle zaprojektowana i stad problemy. dwie sprawy:

  • przejscie na mongodb nie przyspieszy odczytu danych z dysku
  • zadna baza automagicznie nie dobiera dobrej struktury tablic i indeksow
  • nie mozna w nieskonczonosc dodawac hardware zamiast po prostu napisac cos po ludzku ;)
WL
  • Rejestracja:około 21 lat
  • Ostatnio:około 2 miesiące
  • Postów:1082
0
Kopiuj
UPDATE T1
 SET nowe_pole = T2.pole
FROM table1 T1
inner join table2 T2 on (T2.id_obce=T1.id)
AB
  • Rejestracja:prawie 9 lat
  • Ostatnio:ponad 8 lat
  • Postów:229
0
katelx napisał(a):

gdy nieumiejetnie uzywa sie sql to nieumiejetne uczywanie no-sql nie sprawi ze magicznie wszystko przyspieszy. twoja baza jest bardzo mala, mysle ze najprawdopodobniej jest zle zaprojektowana i stad problemy. dwie sprawy:

  • przejscie na mongodb nie przyspieszy odczytu danych z dysku
  • zadna baza automagicznie nie dobiera dobrej struktury tablic i indeksow
  • nie mozna w nieskonczonosc dodawac hardware zamiast po prostu napisac cos po ludzku ;)

Po takich uwagach czuję się ekspertem z MongoDB.

Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)