Dlaczego NoSQL jest szybszy niż SQL?

48

Ostatnio zostałem zapytany:

Dlaczego NoSQL jest szybszy niż SQL?

Nie zgodziłem się z założeniem pytania ... to po prostu nonsens dla mnie osobiście. Nie widzę żadnego wzrostu wydajności przy użyciu NoSQL zamiast SQL. Może SQL nad NoSQL, tak, ale nie w ten sposób.

Czy brakuje mi czegoś o NoSQL?

cnd
źródło
3
Jeśli nie widzisz wzrostu wydajności, tak mówisz. Faktem jest, że większość rozwiązań NoSQL rezygnuje z jednej (lub więcej) właściwości ACID relacyjnej bazy danych, więc robią mniej.
Oded
1
Istnieje kilka przepływów pracy (i struktur danych), których nie można łatwo zmapować do tradycyjnej relacyjnej bazy danych z obsługą ACID. Dla nich możesz zobaczyć ogromny wzrost wydajności, korzystając z bazy danych NoSQL. Jeśli jednak po prostu weźmiesz istniejącą (dobrze zaprojektowaną) bazę danych SQL i umieścisz ją w bazie danych NoSQL, wtedy na pewno ucierpi Twoja wydajność .
Joachim Sauer
1
Odpowiedź brzmi: czy ustalono, że jest szybszy? A w czym szybciej? Czas rozwoju? Czas czytania? Napisz czas? Jaki rodzaj zapisu? Do czego to porównujemy? Zapytania wielostołowe? Dołącza?
Rolf

Odpowiedzi:

65

Istnieje wiele rozwiązań NoSQL, z których każde ma swoje mocne i słabe strony, dlatego poniższe kwestie należy wziąć pod uwagę z odrobiną soli.

Ale zasadniczo to, co robi wiele baz danych NoSQL, polega na denormalizacji i próbuje zoptymalizować pod kątem przypadku denormalizowanego. Załóżmy na przykład, że czytasz post na blogu wraz z jego komentarzami w bazie danych zorientowanej na dokumenty. Często komentarze są zapisywane wraz z samym postem. Oznacza to, że szybciej będzie można je wszystkie pobrać razem, ponieważ są one przechowywane w tym samym miejscu i nie trzeba wykonywać łączenia.

Oczywiście możesz zrobić to samo w SQL, a denormalizacja jest powszechną praktyką, gdy potrzebna jest wydajność. Tyle tylko, że wiele rozwiązań NoSQL jest od samego początku projektowanych i zawsze można z nich korzystać w ten sposób. Otrzymujesz wtedy zwykłe kompromisy: na przykład dodanie komentarza w powyższym przykładzie będzie wolniejsze, ponieważ musisz zapisać cały dokument. Po zdenormalizowaniu musisz zadbać o zachowanie integralności danych w swojej aplikacji.

Co więcej, w wielu rozwiązaniach NoSQL nie można wykonywać dowolnych połączeń, stąd dowolne zapytania. Niektóre bazy danych, takie jak CouchDB, wymagają myślenia przed potrzebnymi zapytaniami i przygotowania ich w bazie danych.

Podsumowując, sprowadza się do oczekiwania na zdenormalizowany schemat i optymalizację odczytów w tej sytuacji, a to działa dobrze w przypadku danych, które nie są wysoce relacyjne i wymagają znacznie więcej odczytów niż zapisów.

Andrea
źródło
4
Nawiasem mówiąc, można to zrealizować za pomocą prostego zmaterializowanego widoku lub warstwy pamięci podręcznej, przy jednoczesnym korzystaniu z całej dobroci SQL. Wszystko, co jest odpowiednio modelowane, jest relacyjne, a logiczne powielanie danych nie jest rozwiązaniem (mat. Widok jest powielaniem, ale nie logicznym powielaniem, ponieważ jest po prostu obrazem czegoś innego).
Morg.
Jak powiedziałem w odpowiedzi, to samo można zrobić w SQL; po prostu gdy staje się to regułą, a nie wyjątkiem, bazy danych NoSQL są zwykle szybsze i bardziej naturalne w użyciu. Teoretycznie SQL jest najlepszym modelem, jaki można zastosować, ale gdy dane rosną powyżej określonego rozmiaru, po prostu nie mogą pomieścić niektórych modeli, a duplikacja danych staje się szybsza i łatwiejsza do uzasadnienia.
Andrea
3
To byk. Model relacyjny obejmuje wszystko, co możesz zrobić w NoSQL i wiele więcej. Jedyną zaletą NoSQL jest to, że wbudowane jest proste i niespójne podejście do skalowania i jest łatwe w użyciu. Nie ma to nic wspólnego z SQL, a wszystko z dbałością o właściwości ACID. Możesz mieć zadania synchronizacji między niezależnymi węzłami SQL, które będą miały dokładnie takie same (bardzo złe) właściwości skalowania i spójności, jakie mają sklepy NoSQL. Różnica polega na tym, że węzły SQL mogą także mieć spójność, jeśli zdecydujesz.
Morg.
1
Co zrobić, jeśli masz 5 000 000 milionów wierszy danych i chcesz uzyskać komentarz od wszystkich z nich pod pewnymi warunkami. Czy nie byłoby szybciej, gdybyś miał indeks w polu komentarza tabeli z SQL? Indeksowanie pełnotekstowe poprawiłoby to jeszcze bardziej.
jwize
@morg - „Model relacyjny obejmuje wszystko, co możesz zrobić w NoSQL i wiele więcej”. Nie, naprawdę nie. Istnieje wiele przykładów typów danych, które są tak źle dopasowane do modelu relacyjnego, że wtłaczanie danych powoduje ogromną nieefektywność. Przykład: gra online ma funkcję przechowywania ekwipunku graczy. Gracze mają skończony zestaw numerowanych miejsc, z których każdy może przechowywać jeden lub więcej przedmiotów określonego typu. Istnieje około 50 różnych rodzajów przedmiotów, z których każdy ma 4-6 powiązanych atrybutów, z pewnym nakładaniem się, więc istnieje około 80 możliwych atrybutów ...
Jules
27

Brakuje w NoSQL tego, że NoSQl nie może być w żaden sposób porównywany z SQL. NoSQL to nazwa wszystkich technologii trwałości, które nie są SQL. Dokumenty DB, DB-Key, Event DBs są wszystkie NoSQL. Wszystkie różnią się prawie we wszystkich aspektach, czy to w strukturze zapisanych danych, zapytaniach, wydajności i dostępnych narzędzi.

Więc jeśli ktoś zadaje takie pytanie podczas wywiadu, powinna to być odpowiedź.

Euforyk
źródło
4
Jeśli jest jedna cecha zabójcza NoSQL, powiedziałbym, że to skalowalność. Właśnie dlatego używają go Facebook i Google. Z powodu gigantycznej ilości danych. NoSQL: kiedy masz do czynienia z ogromną ilością danych.
Pieter B,
16

Bazy danych „NoSQL” (a ściślej: nierelacyjne) rezygnują z niektórych funkcji tradycyjnych baz danych dla szybkości, ale co ważniejsze dla skalowalności poziomej.

Brakujące funkcje zależą od konkretnego produktu, ogólnie pełne właściwości ACID, a nawet operacje łączenia nie są obsługiwane. Jest to cena za zwiększoną wydajność.

Karl
źródło
1
Opisywanie NoSQL jako nierelacyjnego nie jest bardziej precyzyjne. Istnieją inne stare nierelacyjne bazy danych, które nie należą do kategorii NoSQL. NoSQL oznacza znacznie więcej niż nierelacyjny. Przeczytaj to, aby uzyskać więcej informacji: martinfowler.com/bliki/NosqlDefinition.html
eddyP23
8

Masz rację, byłoby nonsensem stwierdzenie tego w ogólnym oświadczeniu. Co prawdopodobnie jest sednem; zamiast jednej odpowiedzi ankieter prawdopodobnie oczekuje, że odpowiesz pytaniami, które pomogą ci dowiedzieć się, jaki jest kontekst problemu (jaki rodzaj danych, ile ich, w jakim środowisku operacyjnym itp.), konkretne rozwiązanie NoSQL . Spróbują dowiedzieć się, w jaki sposób analizujesz problemy, i po drodze dowiedzą się, ile wiesz o różnych dostępnych rozwiązaniach.

Eelco
źródło
Tak, jest to ogólne stwierdzenie, a jeśli uznamy to za prawdziwe, odpowiedź na pytanie brzmi: to zależy.
Rolf
5

Bazy danych NoSQL zwykle mają sens tylko wtedy, gdy projektujesz wokół nich swoje dane.

Jeśli zamierzasz po prostu użyć ich jako zamiennika RDBMS, możesz uzyskać mniejszą wydajność niż większą, szczególnie jeśli nie masz wystarczającego budżetu, aby zapłacić za serwery z dużą ilością pamięci RAM.

Spójrz na ten artykuł, który porównuje wykorzystanie miejsca na dysku MySQL z MongoDB: http://blog.trackerbird.com/content/mysql-vs-mongodb-disk-space-usage

Clifford
źródło
3

Która baza danych NoSQL? Która baza danych SQL? Jeśli ktoś powie Ci, że NoSQL jest szybszy niż SQL, powinieneś odejść. Lub jeszcze lepiej obejrzyj ten film:

http://www.youtube.com/watch?v=b2F-DItXtZs

Nie powiem, że połowa rzeczy, które twierdzą o NoSQL, jest błędna, ale powiem, że istnieje wiele fanboyizmu NoSQL od ludzi, którzy tak naprawdę nie rozumieją tego zbyt dobrze.

SQL ma swoje ograniczenia (oczywiście), ale jest to również bardzo dojrzała technologia, która jest dobrze zrozumiała i ma dużą pulę programistów, którzy rozumieją, jak z niej dobrze korzystać. Nie mogę powiedzieć tego samego o wszystkich formach NoSQL.

Zachary K.
źródło
-2

NoSql obsługiwany przez bazy danych zorientowane na kolumny, w których RDBMS jest bazą danych zorientowaną na wiersze ... I powiedzmy na przykład, że mamy tabelę pracowników z imieniem, wiekiem, wynagrodzeniem, adresem, identyfikatorem pracownika itp. ... umieszczamy tę samą tabelę w MySql (obsługa RDBMS) i HBase (Obsługa NoSQL). Jeśli klient / klient napisze zapytanie w celu uzyskania informacji o średnim wieku lub wynagrodzeniu od danych pracowników 1Lakh ... co się stanie?

W RDBMS będzie ominąć każdy wiersz i zbierze wartość oraz sumę i podział dla wyniku. Jeśli chodzi o bazę danych Columnar, nie musisz się martwić o wszystkie iteracje jednego rzędu wierszy. Ale zajmuj się tylko jednym wierszem, który jest szybszy do obliczenia. W ten sposób czasami NoSQL jest szybszy niż SQL. Ten przypadek NoSQL nie przejmuje się reklamacjami ACID są warte!

Kiran Teja Avvaru
źródło
2
Poprawiłem trochę formatowanie, choć nie jestem pewien, co próbujesz osiągnąć między nimi. A także ACID nie zawsze jest obsługiwany przez RDBMS.
-3

Zapomnij o teorii wokół baz danych ... w momencie, gdy zrozumiesz swoje zapytania, możesz zapisać dane w bazach nosql dokładnie w taki sposób, w jaki są one faktycznie używane w twojej aplikacji ...

Na przykład weźmy ten przykład: masz model klienta z wieloma zamówieniami i wieloma przedmiotami związanymi z każdym zamówieniem, a następnie mają one również wiele zapisanych przedmiotów do późniejszych zakupów ... jeśli jesteś dużym sklepem internetowym z, powiedzmy, 10 milionami klientów i 50 milion zamówień. I ten klient loguje się do swojego pulpitu nawigacyjnego, który wyświetla te dokładne dane, ile pracy zajmie baza danych SQL, aby znaleźć klienta, dołączyć do zamówień i każdego elementu zamówienia i zapisanych pozycji. W bazie danych SQL wszystkie te dane prawdopodobnie będą musiały zostać w jakiś sposób połączone ... lub możesz utworzyć kolekcję w swojej bazie danych o nazwie usercache i zapisać te dane dokładnie tak, jak używasz ich w prawdziwym życiu. Może to być naprawdę jedno zapytanie na jednym polu [id], aby odzyskać wszystkie te dane. Ponadto baza danych nosql nie działa

Więc czy sql db zapytanie o pojedyncze pole Id tak samo szybko, jeśli nie szybciej niż nosql? Tak, ale czy baza danych SQL może zwrócić wszystkie potrzebne dane, sprawdzając jedną tabelę i jedno pole? Nie, chyba że zrobisz coś takiego, jak zapisać dane w Jsonie w dużym polu tekstowym. Ale teraz, gdy dane nie mogą być wyszukiwane w celu potencjalnego wykorzystania w przyszłości.

Steffan Perry
źródło