skąd taki szał z MongoDB

skąd taki szał z MongoDB
AB
  • Rejestracja:prawie 9 lat
  • Ostatnio:ponad 8 lat
  • Postów:229
0

KOlejny test.
Link do źródła: http://pastebin.com/4PXSb4md

Co robi ten test? Wszystko jest bardzo podobne do poprzednich testów.
Najpierw zakłada indeks na pole name.
Potem dodaje 3mln rekordów:

Kopiuj
{
name: string
sname: string
age:int
}

name i sname to losowy ciąg 20 znaków.

Potem 100tys razy wykonuje zapytanie

Kopiuj
select name, sname, age from testcollection where name <= $name  ORDER BY name LIMIT 10

$name zawsze znajduje się w bazie.

W końcu iteruje po znalezionych 10 rekordach i zlicza sumę pola age.

Więc nowe rzeczy to sortowanie i limit, reszta bez istotnych zmian.

Wyniki:

Kopiuj
test mong start...
0.00068528s
692.308s
sum_age = 497079180738
19.1592s
test pg start...
Opened database successfully: testm
Table created successfully
0.0982332s
1721.89s
sum_age = 497079180738
28.8853s

Mogno dodało ponad dwa razy szybciej dane do indeksowanej kolekcji/tabeli.
Mongo 1.50 razy szybciej dokonało wyszukiwania, iterowania po wynikach i sumowania (choć to sumowanie bardziej w C++ zachodzi niż w bazach danych).

Pozdrawiam
P.S.
Uwaga: Jeśli odpalicie u siebie ten test, na innej implementacji generatora liczb losowych lub z innym zarodkiem liczb losowych, to wyniki mogą być inne, ponieważ test jest deterministyczny tylko wtedy gdy wartości w polu name są unikalne.

edytowany 1x, ostatnio: artur_bredzki
KR
Moderator
  • Rejestracja:prawie 21 lat
  • Ostatnio:około 8 godzin
  • Postów:2964
0
artur_bredzki napisał(a):

Zanim zacznę czytać powiedz mi, co nazywasz zapisami sekwencyjnymi. Dla mnie zapis sekwencyjny to jest zapis kolejnych bajtów pod kolejne adresy pamięci, bez np. cofania głowicy na poprzedni adres. Aby był sens rozmawiania o sekwencyjnym zapisie, to musi być przynajmniej 50MB zapisywanych pod ciągłymi adresami i ewentualnie dopiero po tym skok głowicy w 'losowe miejsce' na dysku.

Sugerujesz że w Microsofcie, IBM czy w DataStax o tym nie wiedzą? ;)

To chyba żart. Raczej większość baz nie wymuszała klucza głównego. Postgres na pewno nie wymusza, kilka postów wyżej wkleiłem kod z przykładem tworzenia tabeli bez klucza głównego. No i przy okazji sprawdziłem że unikalny klucz główny spowlnia wstawianie w postresie o jakieś 2%.

Byłbym ostrożny w wyciąganiu zbyt daleko idących wniosków na bazie, która całkowicie mieści się w RAM, więc odczytanie indeksu to jest ułamek czasu zapisu. Spróbuj z tabelą, która ma 500 GB. Wtedy sprawdzenie czy dana wartość klucza jest już w tabeli to losowy odczyt z HDD i masz wydajność na poziomie ~100 zapisów na sek. Natomiast Cassandra na takim samym zbiorze zrobi 30k-100k insertów na sekundę bez większej spinki.

Pomysł z tabelką bez klucza w RDBMSie jest o tyle kiepski, że taka tabelka jest mało przydatna. Ja nie pisałem o braku klucza, tylko o braku konieczności sprawdzania przy wstawianiu, czy rowek już istnieje czy nie. W Cassandrze jak najbardziej klucz główny istnieje i jest unikatowy.

Oczywiście to co się stosuje do Cassandry, nie musi stosować się do Mongo. Być może mongo robi zawsze odczyt przed zapisem. To by tłumaczyło, czemu przegrywa wszystkie benchmarki zapisu z Cassandrą.

Krolik napisał(a):

Nie wiem o ile to spowalnia bazy, myślę że nie powinno więcej niż dwukrotnie spowalniać operacji dodawania, modyfikacji i usuwania - ponieważ taki efekt uzyskuje się poprzez podwójny zapis. Myślę że to samo spowolnienie dotyczy nosql z powodu atomowości na poziomie dokumentu - też musi dwa razy zapisać na wypadek awarii zasilania.

Co będzie szybsze:

  1. zapisać coś raz na HDD i robić fsync co zapis
  2. zapisać coś w 3 kopiach na 3 różnych komputerach podłączonych do trzech UPSów i robić fsync co 10 sekund

fsync na typowym HDD średnio potrzebuje 10 ms
Wysłanie czegoś na inni komputer w tym samym centrum danych z dobrą siecią to opóźnienie < 1 ms.

Krolik napisał(a):

Hmmm to może masz rację. A kiedy dochodzi do takiej sytuacji, że ten myśli że jest primary, a tamten robi rollback?

A znasz niezawodny algorytm na odróżnienie zepsutego serwera od serwera przeciążonego lub od serwera odłączonego od sieci?

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

NIe sprawdziłęm wcześniej czy Mongo pracuje na UTF-8 i już pomyślałem że wszystkie testy były OKDP. Ale z tego co tam
http://stackoverflow.com/questions/14356652/how-to-set-mongodb-charset-to-utf8
piszą:
[
BSON can only be encoded in UTF-8. If your problem is with export and console, you probably are not converting your data to UTF-8 before uploading it to mongodb.
]
Nie ma innej opcji niż UTF8 dla Mongo.

Pozdrawiam

AB
  • Rejestracja:prawie 9 lat
  • Ostatnio:ponad 8 lat
  • Postów:229
0
Krolik napisał(a):
artur_bredzki napisał(a):

Zanim zacznę czytać powiedz mi, co nazywasz zapisami sekwencyjnymi. Dla mnie zapis sekwencyjny to jest zapis kolejnych bajtów pod kolejne adresy pamięci, bez np. cofania głowicy na poprzedni adres. Aby był sens rozmawiania o sekwencyjnym zapisie, to musi być przynajmniej 50MB zapisywanych pod ciągłymi adresami i ewentualnie dopiero po tym skok głowicy w 'losowe miejsce' na dysku.

Sugerujesz że w Microsofcie, IBM czy w DataStax o tym nie wiedzą? ;)

Bynajmniej nie chodziło o sugerowanie że ktoś tego nie wie, straciłem pewność czy ja wiem w obliczu tego co piszesz :)

Krolik napisał(a):

To chyba żart. Raczej większość baz nie wymuszała klucza głównego. Postgres na pewno nie wymusza, kilka postów wyżej wkleiłem kod z przykładem tworzenia tabeli bez klucza głównego. No i przy okazji sprawdziłem że unikalny klucz główny spowlnia wstawianie w postresie o jakieś 2%.

Byłbym ostrożny w wyciąganiu zbyt daleko idących wniosków na bazie, która całkowicie mieści się w RAM, więc odczytanie indeksu to jest ułamek czasu zapisu. Spróbuj z tabelą, która ma 500 GB. Wtedy sprawdzenie czy dana wartość klucza jest już w tabeli to losowy odczyt z HDD i masz wydajność na poziomie ~100 zapisów na sek. Natomiast Cassandra na takim samym zbiorze zrobi 30k-100k insertów na sekundę bez większej spinki.

Pierwsza sprawa: Zgadzam się że zupełnie inną sprawą są testy gdy dane mieszczą się w buforze ram niż gdy się nie mieszczą.

Druga sprawa: Wszystkie operacje wyszukiwania których nie można zaindeksować na tabeli 500GB zapisanej na HDD trwają kilka - kilkadziesiąt godzin. Nie jestem do końca przekonany czy warto w ogóle interesować się takimi przypadkami? Niby SATA 3.0 umożliwia transfer 6 Gbit/s, więc przy zastosowaniu RAID można 500GB odczytać w 666 sekund - jak na raport miesięczny to czas dobry, ale jak na webserwis to 2tys razy za długo. Generalnie moje pytanie jest takie, dlaczego warto się interesować takim przypadkiem? Zbieramy 500GB danych i pracyjemy tylko na selektach które dobrze współpracują z indeksami - czy to jest praktyczny przypadek?

Trzecia sprawa: piszesz że Cassandra 'na takim' - nie wiem czy chodzi o ten w RAM, czy o ten 500GB na HDD. Jeśli chodzi o ten na HDD, to znaczy, że Cassandra nie sprawdza unikalności klucza, ale zakłada jego unikalność (np. zawsze inkrementuje o jeden) i zapisuje sekwencyjnie bez sprawdzania po 'losowo' rozrzuconych węzłach b-tree.

Krolik napisał(a):

Pomysł z tabelką bez klucza w RDBMSie jest o tyle kiepski, że taka tabelka jest mało przydatna. Ja nie pisałem o braku klucza, tylko o braku konieczności sprawdzania przy wstawianiu, czy rowek już istnieje czy nie. W Cassandrze jak najbardziej klucz główny istnieje i jest unikatowy.

Inaczej używamy pojęć. Dla mnie klucz główny w RDBMS jest wtedy, gdy go zdefiniujemy, czyli np. w Postgresie używamy do tego celu PRIMARY KEY. Gdy zdefiniujemy, to Postgres założy z automatu 'unikalny indeks' i będzie sprawdzał czy nie dochodzi do próby zduplikowania. Gdy użyjemy kolumny, która z założenia ma niepowtarzalne wartości, ale nie zrobimy takiej definicji w ramach RDBMS, to dla mnie jeszcze nie jest PRIMARY KEY, choć może świetnie pełnić jego rolę.

Krolik napisał(a):

Oczywiście to co się stosuje do Cassandry, nie musi stosować się do Mongo. Być może mongo robi zawsze odczyt przed zapisem. To by tłumaczyło, czemu przegrywa wszystkie benchmarki zapisu z Cassandrą.

Zastanówmy się jak to można zaimplementować:
Wariant pierwszy:

  1. Odczytujemy wartość licznika z dysku do ram.
  2. Inkrementujemy wartość licznika.
  3. Zapisujemy do pliku logu wartość licznika i wstawiany rekord
  4. Robimy sync
  5. Przerzucamy z pliku logu rekord do tabeli, a licznik tam gdzie baza trzyma liczniki.
  6. Robimy sync
    Wszystko jest w pełni bezpieczne, w razie padu baza zachowa pełną spójność, nie trzeba sprawdzać uniklaności (dla dużych intów, rzecz jasna).

Warinant drugi:

  1. Baza wczytuje licznik do ram licznik
  2. Baza inkrementuje licznik
  3. Baza zapisuje wstawiany rekord do pliku logów wraz licznikiem.
  4. Gdy ilość rekordów w pliku logów wynosi N, to baza robi sync, przerzuca logi do tabel i zapisuje licznik z ram na dysk i znowu robi sync.
    Też wydaje się bezpieczne, wypadają dwie operacje sync na N rekordów, zapis na końcu tabel lub na końcu pliku dziennika, wiec można uzyskać dużą wydajność. W razie padu baza musi odtworzyć wartość licznika z odtworzonych rekordów - i tyle.

Pozostałych wariantów chyba nie ma co analizować, warinat drugi wydaje się najszybszy i bezpieczny.

Krolik napisał(a):
Krolik napisał(a):

Nie wiem o ile to spowalnia bazy, myślę że nie powinno więcej niż dwukrotnie spowalniać operacji dodawania, modyfikacji i usuwania - ponieważ taki efekt uzyskuje się poprzez podwójny zapis. Myślę że to samo spowolnienie dotyczy nosql z powodu atomowości na poziomie dokumentu - też musi dwa razy zapisać na wypadek awarii zasilania.

Co będzie szybsze:

  1. zapisać coś raz na HDD i robić fsync co zapis
  2. zapisać coś w 3 kopiach na 3 różnych komputerach podłączonych do trzech UPSów i robić fsync co 10 sekund

fsync na typowym HDD średnio potrzebuje 10 ms
Wysłanie czegoś na inni komputer w tym samym centrum danych z dobrą siecią to opóźnienie < 1 ms.

Jeśli pady tych trzech komputerów będą niezależne (tzn jeśli prawdopodobieństw awarii jednego komputera równe p implikuje prawdopodobieństwo p^3 trzech komputerów) to rozwiązanie drugie bije na głowę rozwiązanie pierwsze pod każdym względem. Ale jeśli kupimy dyski w tym samym sklepie, od tego samego producenta, z tej samej serii i jeśli zaczniemy wykonywać na wszystkich dyskach pdobne operacje co do ilości i jakości, to z dużym prawdopodobieństwem padną w tym samym czasie na wszystkich trzech komputerach :D

Krolik napisał(a):
Krolik napisał(a):

Hmmm to może masz rację. A kiedy dochodzi do takiej sytuacji, że ten myśli że jest primary, a tamten robi rollback?

A znasz niezawodny algorytm na odróżnienie zepsutego serwera od serwera przeciążonego lub od serwera odłączonego od sieci?

Znam czy nie znam, w praktyce masz rację że uzyskanie takiego efektu jest diablenie trudne.

Pozdrawiam

edytowany 1x, ostatnio: artur_bredzki
KR
Moderator
  • Rejestracja:prawie 21 lat
  • Ostatnio:około 8 godzin
  • Postów:2964
0

Druga sprawa: Wszystkie operacje wyszukiwania których nie można zaindeksować na tabeli 500GB zapisanej na HDD trwają kilka - kilkadziesiąt godzin. Nie jestem do końca przekonany czy warto w ogóle interesować się takimi przypadkami?

Nie mieszaj analityki z zastosowaniami transakcyjnymi. Dwa zupełnie różne światy. W systemach transakcyjnych nigdy nie masz full-scanów, chyba że dla tabelki mającej 20 rowków i wiesz, że będzie mieć 20 rowków a nie 2000. Szybkość skanowania danych jest interesująca tylko dla analityków. Nawet skanowanie 100 MB danych trwałoby zbyt długo dla typowych systemów transakcyjnych, które wymagają odpowiedzi w pojedyncze milisekundy. Zobacz, Google ma zaindeksowane petabajty danych, a wyszukuje w nich w milisekundy. W ogóle stąd się wzięło BigData i NoSQL (później wiele pomysłów przeszło z NoSQL do klasycznych RDBMSów) - trzeba było wymyślić coś na te wszystkie przypadki, gdzie jeden serwer nie wystarczał.

Generalnie moje pytanie jest takie, dlaczego warto się interesować takim przypadkiem?

Zbieramy dane z tysięcy czujników / transakcji i chcemy generować w locie ostrzeżenia o np. podejrzanych transakcjach (wszelkie banki czy systemy płatności). Albo robimy serwis ala Spotify / Facebook / Gmail itp. Po prostu jest całe mnóstwo przypadków gdzie dane nie mieszczą się w pamięci, a jednak chcemy je szybko wyszukiwać i musimy dawać odpowiedzi w milisekundy. A nawet jeśli dane mieszczą się w pamięci to i tak nie ma czasu skanować całej pamięci, bo to też trwa za długo.

Trzecia sprawa: piszesz że Cassandra 'na takim' - nie wiem czy chodzi o ten w RAM, czy o ten 500GB na HDD. Jeśli chodzi o ten na HDD, to znaczy, że Cassandra nie sprawdza unikalności klucza, ale zakłada jego unikalność (np. zawsze inkrementuje o jeden) i zapisuje sekwencyjnie bez sprawdzania po 'losowo' rozrzuconych węzłach b-tree.

Miałem na myśli ten przypadek z 500 GB. Nie zgaduj, tylko poczytaj jak to jest zrobione, bo błądzisz w mroku. Nie sprawdza unikalności i nie zakłada jego unikalności, ale po operacji wstawienia jest zawsze unikalny. Baza SQLowa tak nie może, bo SQL ma taką a nie inną sematykę, że INSERT wymaga rzuceniem błędu przy próbie wstawienia czegoś co już jest. Cassandra, podobnie jak wiele baz klucz-wartość, wybiera po prostu nadpisanie danych o tym samym kluczu i tyle, tak jak typowy HashMap / słownik. Poza tym nie wiem czemu myślisz o kluczu jako o liczbie. Klucz może być czymkolwiek. Np. stringiem. I klucza nie generuje baza, a użytkownik. W RDBMSach owszem czasem stosuje się sekwencje lub kolumny auto-increment, ale w systemie rozproszonym takie rozwiązanie nie ma racji bytu, bo kto miałby niby generować ten unikatowy licznik?

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

Druga sprawa: Wszystkie operacje wyszukiwania których nie można zaindeksować na tabeli 500GB zapisanej na HDD trwają kilka - kilkadziesiąt godzin. Nie jestem do końca przekonany czy warto w ogóle interesować się takimi przypadkami?

Nie mieszaj analityki z zastosowaniami transakcyjnymi. Dwa zupełnie różne światy. W systemach transakcyjnych nigdy nie masz full-scanów, chyba że dla tabelki mającej 20 rowków i wiesz, że będzie mieć 20 rowków a nie 2000. Szybkość skanowania danych jest interesująca tylko dla analityków.

Muszę przyznać że do tej pory nie zastanawiałem się nad rozróżnieniem systemów na analityczne i transakcyjne.

Krolik napisał(a):

Nawet skanowanie 100 MB danych trwałoby zbyt długo dla typowych systemów transakcyjnych, które wymagają odpowiedzi w pojedyncze milisekundy.

Zgodzę się z Tobą. W milisekundę ciężko cokolwiek zrobić na komputerze, za wyjątkiem uruchomionego procesu który przez 1ms może wykonać miliony operacji na jednym rdzeniu. Jednak w praktyce odpowiedź bazy w granicach 0.2 - 0.5 sekundy jest akceptowalna. Potem dochodzi czas na jakiś przesył danych, renderowanie interfejsu, albo na składanie wyników gdy używamy map-reduce, więc w efekcie odpowiedź całego systemu będzie na poziomie 2s. To zazwyczaj jest bardzo dobry czas. Alegro mi bardzo imponuje, można wyszukiwać po tekscie, po wielu innych parametrach, sortować według wielu kryteriów i odpowiedź jest błyskawiczna.

Krolik napisał(a):

Zobacz, Google ma zaindeksowane petabajty danych, a wyszukuje w nich w milisekundy.
W ogóle stąd się wzięło BigData i NoSQL (później wiele pomysłów przeszło z NoSQL do klasycznych RDBMSów) - trzeba było wymyślić coś na te wszystkie przypadki, gdzie jeden serwer nie wystarczał.

Dawno straciłem wyczucie co w przypadku słynnego Google jest mitem, a co prawdą. Ile wyników wyszukiwania widziałeś najwięcej, bo ja jeden tysiąc, nigdy nie widziałem chociażby 10 tys. W przypadku wyszukiwarek internetowych największym problemem jest posortowanie wyników, a czemu zawdzięczają szybkość działania, to nie jestem pewny. Raczej przeglądarki nie działają tak że mają zapełnione dyski hdd i do wyszukiwania typowy indeks z RDBMSa, np. taki jak btree lub hashtable.

Krolik napisał(a):

Generalnie moje pytanie jest takie, dlaczego warto się interesować takim przypadkiem?

Zbieramy dane z tysięcy czujników / transakcji i chcemy generować w locie ostrzeżenia o np. podejrzanych transakcjach (wszelkie banki czy systemy płatności). Albo robimy serwis ala Spotify / Facebook / Gmail itp. Po prostu jest całe mnóstwo przypadków gdzie dane nie mieszczą się w pamięci, a jednak chcemy je szybko wyszukiwać i musimy dawać odpowiedzi w milisekundy. A nawet jeśli dane mieszczą się w pamięci to i tak nie ma czasu skanować całej pamięci, bo to też trwa za długo.

No tak, ale jeśli użyjemy przeciętnego RDBMSa i dostępnych w nim indeksów, to zbyt inteligentnego wyszukiwania nie będziemy mieli? Mamy np. bazę artykułów. W artykule jak wiadomo mamy np. 1-5tys słów. Użytkownik wpisuje 5-10 słów kluczowych które mają się pojawić i z 2-3 które nie mogą się pojawić. Przy czym w słowach mogą być literówki, bo google z literówką sobie poradzi. Ponadto, jeśli 'ciągła fraza' się pojawia na stronie X, a na stronie Y pojawiają się rozbite słowa kluczowe, to strona X powinna być wyświetlona wyżej niż strona Y. Podsumowując - nie wierzę, aby to zadanie nadawało się na dyski hdd z odpowiednim indeksem.

Krolik napisał(a):

Trzecia sprawa: piszesz że Cassandra 'na takim' - nie wiem czy chodzi o ten w RAM, czy o ten 500GB na HDD. Jeśli chodzi o ten na HDD, to znaczy, że Cassandra nie sprawdza unikalności klucza, ale zakłada jego unikalność (np. zawsze inkrementuje o jeden) i zapisuje sekwencyjnie bez sprawdzania po 'losowo' rozrzuconych węzłach b-tree.

Miałem na myśli ten przypadek z 500 GB. Nie zgaduj, tylko poczytaj jak to jest zrobione, bo błądzisz w mroku.

Nie poczytam, bo nie przebrnę przez szczegóły. Ogólnie zastanowiłem się jak to może być rozwiązane.

Krolik napisał(a):

Nie sprawdza unikalności i nie zakłada jego unikalności, ale po operacji wstawienia jest zawsze unikalny.

Tutaj chyba jest sprzeczność. Unikalność musi z czegoś wynikać. Może wynikać ze sprawdzenia czy jest unikalny, albo z założenia, że dany algorytm nigdy nie wygeneruje dwóch identycznych wartości.

Krolik napisał(a):

Baza SQLowa tak nie może, bo SQL ma taką a nie inną sematykę, że INSERT wymaga rzuceniem błędu przy próbie wstawienia czegoś co już jest.
Cassandra, podobnie jak wiele baz klucz-wartość, wybiera po prostu nadpisanie danych o tym samym kluczu i tyle, tak jak typowy HashMap / słownik.

Z punktu widzenia wydajności, albo z punktu widzenia możliwości sekwencyjnego zapisu (bo od tych tematów się zaczął ten wątek) to jest to samo. Obojętnie czy rzucimy wyjątek, czy nadpiszemy dane, to musimy sprawdzić czy dany klucz nie istnieje, albo musimy założyć że nie istnieje. Gdy sprawdzamy, to jedna i druga baza musi posłużyć jakimś indeksem. Jeśli posluguje się indeksem nie mieszczącym się w RAM, to nie zapiszemy na HDD więcej niż 50 rekordów na sekundę. Gdy używamy w dodatku podwójnego zapisu (dziennik) to nie zdziwiłbym się, gdyby 'ograniczenia technologii' były na poziomie 30 rekordów na sekundę. Ograniczenia technologii, czyli dowolna baza ich nie przeskoczy.

Krolik napisał(a):

Poza tym nie wiem czemu myślisz o kluczu jako o liczbie. Klucz może być czymkolwiek. Np. stringiem. I klucza nie generuje baza, a użytkownik. W RDBMSach owszem czasem stosuje się sekwencje lub kolumny auto-increment, ale w systemie rozproszonym takie rozwiązanie nie ma racji bytu, bo kto miałby niby generować ten unikatowy licznik?

Nie myślę o kluczu jako o liczbie, tylko użyłem przykładu w którym klucz jest zdefiniowany na jednej kolumnie typu int. Użyłem takiego przykładu, ponieważ operacje na intach są szybkie, a my o szybkim wykonywaniu operacji rozmawialiśmy.

P.S.
Testów dalszych na razie nie mam, bo chwilowy brak czasu, ale będę kontynuował, będą agregacje i nie tylko.

Pozdrawiam

edytowany 1x, ostatnio: artur_bredzki
vpiotr
  • Rejestracja:ponad 13 lat
  • Ostatnio:prawie 3 lata
2

Chyba trochę odlecieliście w tej dyskusji.

W ostatnim poście naliczyłem co najmniej 4 różne gatunki baz danych które analizujecie jakby jedna baza miała być rozwiązaniem na każdy case:

Zabrakło tylko (albo przeoczyłem) baz grafowych.

To trochę taka dyskusja nad rozmiarem bajta (*)... (poniekąd ciekawa, ale do czego to ma prowadzić?)

(*) 4004, http://catb.org/~esr/jargon/html/B/byte.html

Aventus
Bardzo good powiedziane...
AB
  • Rejestracja:prawie 9 lat
  • Ostatnio:ponad 8 lat
  • Postów:229
0
vpiotr napisał(a):

Chyba trochę odlecieliście w tej dyskusji.

W ostatnim poście naliczyłem co najmniej 4 różne gatunki baz danych które analizujecie jakby jedna baza miała być rozwiązaniem na każdy case:

Zabrakło tylko (albo przeoczyłem) baz grafowych.

To trochę taka dyskusja nad rozmiarem bajta (*)... (poniekąd ciekawa, ale do czego to ma prowadzić?)

(*) 4004, http://catb.org/~esr/jargon/html/B/byte.html

Zgadzam się, że są to różne bazy i optymalizowane pod rożnym kątem. Ale prawdą jest też, że jakiś wspólny (i to nie jeden) mianownik jest pomiędzy różnymi bazami, więc porównywać różne bazy można. Weźmy tak różne bazy jak Redis i Postgres. Jedna baza RAM, druga transakcyjna - zupełnie różne bazy. Ale:

  1. Redis potrafi zrzucić dane na dysk
  2. Postgres buforuje dane w pamięci RAM.
    Oczywiście Postgres potrafi więcej niż zrzucanie do pliku danych, ale trudno zaprzeczyć że jakiś wspólny mianownik jest.

Pozdrawiam

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

Nie mogę wysłać posta, nie wiem co jest problemem. Jeśli wysyłam trochę więcej tekstu, jeśli są bloki z code, jeśli jest podwójny cudzysłów, to błąd pojawia się częściej. Nie umiem doprowadzić swojego posta do takiej formy aby wszedł na formu.

Link do posta:
http://pastebin.com/dm0tzM2z

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

Wygląda na to, że MongoDB ma problem z sortowaniem łańcuchów. Jeśli rozwiązanie zaproponowane w linku
http://stackoverflow.com/questions/22931177/mongo-db-sorting-with-case-insensitive

jest jedynym rozwiązaniem, to chyba dyskwalifikuje tę bazę w wielu zastosowaniach :/

Pozdrawiam

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

Kolejny test. Link do źródła:
http://pastebin.com/DvyQk89a

Test polega na wstawieniu 500tys rekordów i wykonaniu zapytania:

Kopiuj
select name, sname, age from testcollection where name <= '$name'  ORDER BY name LIMIT 30 OFFSET 50000

Wyniki:

Kopiuj
test mong start...
0.000718861s
99.6782s
sum_age = 36495810383
147.877s
test pg start...
Opened database successfully: testm
Table created successfully
0.0976735s
112.523s
sum_age = 36495810383
213.581s

Niby mongo wygrywa. W wyszukiwaniu jest 1.44 razy szybsze. Ale jeśli w bazie będą mała i duże znaki, to w mongo nie można tego tak prosto rozwiązać.

Pozdrawiam

vpiotr
Bez sumowania robionego w bazie to tak jakbyś porównywał prędkość toczenia się samochodów pchanych przez ludzi.
AB
  • Rejestracja:prawie 9 lat
  • Ostatnio:ponad 8 lat
  • Postów:229
0

Bez sumowania robionego w bazie to tak jakbyś porównywał prędkość toczenia się samochodów pchanych przez ludzi. - vpiotr 10 minut temu

Nie zgodzę się. Na razie nie testuję agregacji, tylko szybkość wykonywania zapytań i szybkość interfejsu. Suma jest tylko po to, aby sprawdzić czy oba zapytania zwracają (z pewnym prawdopodobieństwem) te same wyniki, to rodzaj sumy kontrolnej.

Pozdrawiam

vpiotr
Testujesz rozwiązanie sub-optymalne, czyli coś czego zwykle się nie robi. Ale to tylko opinia, masz prawo się z nią nie zgadzać.
1
Kopiuj
Testujesz rozwiązanie sub-optymalne, czyli coś czego zwykle się nie robi. Ale to tylko opinia, masz prawo się z nią nie zgadzać. - vpiotr	wczoraj, 21:41

Dali mi bana, więc już więcej nie będę się udzielał na tym formu. Żegnam kolegów.

Zobacz pozostały 1 komentarz
somekind
Nikt mu żadnego bana nie dał. Znowu dajecie się trollować.
PA
@artur_bredzki zwracal uwage na to, ze nie moze pisac komentarzy, moze to jest przyczyna tego, że nie może się zalogować.
somekind
Komu zwracał uwagę? Zdanie wtrącone w środku posta to nie jest żadna informacja dla administracji.
PA
Napisałem w kontekście zaistniałej sytuacji. Nie w sensie, że zglaszal to komuś z administracji. Tak mi się skojarzyło, dlatego zwróciłem na to uwagę ;)
somekind
Nie no, ja rozumiem, że podzieliłeś się tym, co zauważyłeś. Ja też się dzielę obserwacjami - nikt tu nikomu nie zabrania wpisywania losowych informacji w losowe miejsca losowych postów. Równie dobrze przecież można w poście napisać: "kochanie podaj mi sól". ;) Tylko skuteczność raczej niewielka. :P
0

Lepiej napiszę anonimowo bo i ja dostanę bana.

Testy robiły się interesujące. Ciekawe o ile baza dokumentowa może być szybsza od transakcyjnej. Autor się nie odzywa, więc wygląda na to że naprawdę dostał bana albo się obraził, a szkoda. Chciałem zrobić kilka testów samemu ale mam problem z instalcją pluginu mongo. Kompilator nie może znaleźć plików nagłówkowych. Na stackoverflow jest opisany identyczny problem, ale po ponownej instalcji u tamtego autora problem zniknął, u mnie nic nie pomaga. Czy ktoś wie jak obejść ten problem?

Pzd

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

Teraz faktycznie bana nie ma, ale wcześniej po zalogowaniu otrzymywałem wiadomość że mam bana bezterminowo.
Powód bana: trolling.

Komentować nie mogę nadal. Otrzymuję alert (okienko alert z html/js) z następującą treścią:
http://pastebin.com/wMQYce7H
Może to pomoże komuś kto prowadzi to forum.

Pozdrawiam

vpiotr
Może masz jakieś felerne IP zgodne z jakimś trolem.
Maciej Cąderek
Maciej Cąderek
No mnie by ban nie zdziwił za nie przestrzeganie netykiety - przycisk edycji też masz zablokowany?
AB
  • Rejestracja:prawie 9 lat
  • Ostatnio:ponad 8 lat
  • Postów:229
0

No mnie by ban nie zdziwił za nie przestrzeganie netykiety - przycisk edycji też masz zablokowany? - Maciej Cąderek wczoraj, 21:52

Przepraszam, jakiej netykiety? Kogoś oczerniam, okłamuję, wyłudzam, nawołuję do przemocy, ranię uczucia religijne, zamieszczam treści rasistowskie, erotyczne? Co mam wyedytować? Przyczyna bana była jasno podana: trolling. Jeśli testy które wykonałem i rozmowa nad ich slusznością bądź brakiem słuszności jest troligniem, to już nic nie poradzę.

Nie działają u mnie komentarze i wysyłanie bardziej skomplikowanych postów. Edycja też czasami nie działa, prawdopodobnie też wtedy gdy treść jest bardziej skomplikowana. Nie wiem czemu nie działa, kiedyś działało, a przeglądarki nie zmieniałem, systemu też nie uaktualniałem.

Pozdrawiam

edytowany 1x, ostatnio: artur_bredzki
somekind
Nigdy nie dostałeś żadnego bana, przyjmij to wreszcie do wiadomości. Jeśli masz problemy z działaniem forum, a ich nie zgłaszasz, to jest WYŁĄCZNIE TWÓJ problem.
vpiotr
zgłoś to tutaj: Coyote (patrz też link na dole strony).
0

PO ok. dwóch minutach szukania w googlach muszę stwierdzić że to jest coś co "programiści" php lubią najbardziej.
Myślę że baza z silnikiem nocnikdb byłaby o wiele bardziej użyteczna dla takiego programisty.

"Definiowanie niestandardowych dyrektyw AngularJS, które rozszerzają język HTML
Budowanie w języku JavaScript usług internetowych po stronie serwera"

ps.
Nie ubliżam użytkownikam PHP bo sam mam go używam do niektórych rozwiązań łacznie z własnymi rozszerzeniami przez zenada.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.