Ab welcher Datenmenge ist es sinnvoll, von SQL auf NoSQL zu wechseln?

24

Als Programmierer für relationale Datenbanken lese ich (die meiste Zeit) Artikel darüber, wie relationale Datenbanken nicht skaliert werden und wie NoSQL-Lösungen wie MongoDB. Da die meisten Datenbanken, die ich bisher entwickelt habe, klein bis mittelgroß waren, hatte ich noch nie ein Problem, das durch Indizierung, Abfrageoptimierung oder Schema-Redesign nicht gelöst wurde.

Mit welcher Größe würde MySQL wohl zu kämpfen haben? Wie viele Zeilen?

(Ich weiß, dass dies von der Anwendung und der Art der gespeicherten Daten abhängt. Die Sache, die ich bekam, war im Grunde eine Genetikdatenbank, also hätte ich eine Haupttabelle mit 3 oder 4 Nachschlagetabellen. Die Haupttabelle wird unter anderem enthalten andere Dinge, eine Chromosomenreferenz und eine Positionskoordinate. Es wird wahrscheinlich nach einer Anzahl von Einträgen zwischen zwei Tränken auf einem Chromosom abgefragt, um zu sehen, was dort gespeichert ist.

wobbily_col
quelle
4
Sie sollten wahrscheinlich nicht unter der Annahme arbeiten, dass MySQL die Obergrenze für die Anzahl der Zeilen ist, die eine relationale Datenbank verarbeiten kann. Sie stellen wirklich zwei Fragen: Wann geht MySQL die Schnur aus? und Was sind die Grenzen der SQL RDBMS-Kapazität? Welches möchtest du beantwortet bekommen?
Blrfl

Antworten:

13

Wie groß sind die Daten?

Es gibt zwei signifikante Schwellenwerte:

  1. ganze Daten passen in den RAM
  2. ganze Indexdaten passen in den RAM

Bei schnellen SSDs wurde der erste Schwellenwert ein bisschen weniger ein Problem, es sei denn, Sie haben verrückt viel Verkehr.

Säure

Eines der Probleme bei der Skalierung von RDBMS besteht darin, dass es sich konstruktionsbedingt um ACID handelt, was Transaktionen und Sperren auf Zeilenebene (oder sogar auf Tabellenebene in einigen älteren / einfacheren RDBMS) bedeutet. Dies kann ein einschränkender Faktor sein, wenn Sie viele Abfragen haben, durch die viele Daten gleichzeitig ausgeführt werden. NoSQL-Lösungen setzen in der Regel auf ein Konsistenzmodell .

Wie skaliert RDBMS anhand der Datengröße?

Es ist nicht ganz richtig, dass RDBMS nicht auf die Datengröße skaliert werden kann. Es gibt zwei Alternativen: vertikale Partitionierung und horizontale Partitionierung (auch bekannt als Sharding).

Bei der vertikalen Partitionierung werden im Grunde nicht verwandte Tabellen auf separaten DB-Servern gespeichert, sodass die Größe der einzelnen Tabellen unter den oben genannten Schwellenwerten liegt. Dies macht das Verknüpfen dieser Tabellen mit einfachem SQL weniger einfach und weniger effizient.

Sharding bedeutet das Verteilen von Daten aus einer Tabelle auf verschiedene Server, basierend auf einem bestimmten Schlüssel. Dies bedeutet, dass Sie für Suchvorgänge wissen, welcher Server basierend auf diesem Schlüssel abgefragt werden soll. Dies erschwert jedoch Abfragen, die nicht auf dem Sharding-Schlüssel nachgeschlagen werden.

Wenn Sie bei beiden Arten der Partitionierung zu extremen Ergebnissen kommen, haben Sie im Grunde die gleiche Situation wie bei NoSQL-Datenbanken.

vartec
quelle
9
Oracle, PostgreSQL, MySQL, MS SQL Server und Sybase sind alle in der Lage, tabellenübergreifende Joins auf Remoteservern durchzuführen, ohne dass der Client irgendwelche Arbeiten ausführen muss.
Blrfl
4
Bei "ganzen Daten im RAM" ist zu beachten, dass es sich um den tatsächlichen Arbeitssatz handelt. Oft sind Datenbanken größer als Speicher, aber auf das meiste wird nur selten zugegriffen. Dies ist nicht so schlimm, solange sich Indizes und häufig abgerufene Zeilen usw. im Speicher befinden
Johannes,
2
@vartec Sie möchten also meine 2 Jahre alten E-Mails aus meiner Mail-Datenbank löschen, da ich sie nur einmal im Monat durchsuche, während meine Hauptarbeitsgruppe nur die letzten zehn E-Mails enthält?
Johannes
3
@ Wobbily_col Hinweis: Es ist nicht. es sei denn, Sie interessieren sich nicht für Beständigkeit, Zuverlässigkeit oder Haltbarkeit. In diesem Fall können Sie viele Dinge ausschalten, die einen weitaus schneller als den anderen machen, oder umgekehrt, wenn Sie möchten. raten Sie mal, was sind die Standardkonfigurationen auf jedem? (Natürlich ist MySQL auch nicht der Gipfel der Datensicherheit ...)
Javier
1
@vartec "Automatic sharding" ist nett, wo es anwendbar ist. Aber plötzlich können Sie nicht mehr alle Daten zusammenfügen - oh warte, das können Sie nicht mit einer Dokumentendatenbank, die auch alle Daten durchsucht oder Berichte erstellt, machen. Ja, Dokumentendatenbanken haben ihren Platz, wenn Datenmodell und Vorgänge stimmen überein, auch für andere Systeme ... Datenmenge allein ist kein Faktor (ich kenne genügend MySQL-Instanzen, die mit Daten im Terabyte-Bereich erfolgreich ausgeführt werden ... und Projekte mit einigen hundert MB Ausfall)
Johannes,
13

Ich denke nicht, dass die Größe der Daten der einzige Faktor ist. "Datenmodell" ist auch ein sehr wichtiger Teil.

E-Commerce-Katalogseiten (Solr, ElasticSearch), Webanalysedaten (Riak, Cassandra), Aktienkurse (Redis), Beziehungsverbindungen in sozialen Netzwerken (Neo4J, FleetDB) sind nur einige Beispiele, wenn eine NoSQL-Lösung wirklich glänzt.

Meiner Meinung nach spielt das Datenmodell bei der Betrachtung einer NoSQL-Lösung oder eines RDBMS eine wichtigere Rolle als die Datengröße.

Chiron
quelle
9
Genau. all dieser "Big Data" -Bla-Bla-Mist ist Marketing-Sprechen und das ganze "NoSQL für Big Data!" Zeug ist auch. NoSQL eignet sich für große Datenmengen, da es schneller ist als ein herkömmliches RDBMS, aber es ist schneller, da es große Kompromisse bei den Funktionen eingeht. Viele Datenmodelle werden unter diesen Kompromissen erheblich leiden, während einige einwandfrei funktionieren werden. Es geht darum zu wissen, was Sie verlieren, wenn Sie zu NoSQL wechseln, und NoSQL nur für Daten zu verwenden, die solche Verluste erleiden können.
Jimmy Hoffa
1
Es ist zwar wahr, aber nicht die Antwort auf die gestellte Frage.
Vartec
Dies ist nicht nur NICHT die Antwort, sondern auch NICHT wahr. Sie können ein Dokument wie eine Tabelle in einer SQL-Datenbank nur mit dem JSON-Datentyp erstellen und die SQL-Datenbank über NoSQL leuchten lassen.
Jewgenij Afanasjew
6

Wenn relationale Datenbanken nicht skaliert werden, geschieht nichts. Machen Sie sich keine Sorgen über Skalierungsprobleme.

SQL hat Probleme mit einigen Arten von Analysen, aber es werden nicht viele Daten benötigt, um das Problem auszulösen. Stellen Sie sich beispielsweise eine einzelne Tabelle mit einer Spalte vor, die auf der Grundlage eines eindeutigen Schlüssels auf andere Zeilen verweist. In der Regel kann dies zum Erstellen einer Baumstruktur verwendet werden. Sie können schnelle SQL-Anweisungen schreiben, die auf die zugehörige Zeile verweisen. Oder die verwandte Zeile der verwandten Zeile. Tatsächlich können Sie beliebig viele Sprünge machen. Wenn Sie jedoch für jede Zeile ein Feld in der ersten verwandten Zeile in der Kette auswählen möchten, das ein bestimmtes Kriterium erfüllt, wird es kompliziert.

Betrachten Sie eine Tabelle mit Bürostandorten auf der Ebene von Nation, Provinz / Bundesstaat, Landkreis, Stadt und Dorf, wobei jedes Büro auf das Büro verweist, an das es berichtet. Es gibt keine Garantie dafür, dass die Meldestelle eines jeden Büros nur eine Ebene höher ist. Für eine ausgewählte Gruppe von Ämtern, die sich nicht alle auf einer Ebene befinden, möchten Sie die jeweiligen nationalen Ämter auflisten. Dies erfordert Schleifen von SQL-Anweisungen und wird auch heute noch viel Zeit in Anspruch nehmen. (Früher hatte ich 30 Sekunden für eine Auswahl von 30 Büros, aber das ist lange her - und der Wechsel zu gespeicherten Prozeduren hat ein bisschen geholfen.)

Die Alternative besteht also darin, die gesamte Struktur in einem großen Datenblock zusammenzufassen, zu beschriften und zu speichern. Wenn Sie die Daten analysieren möchten, lesen Sie sie alle auf einmal in den Speicher, richten Sie Zeiger ein, um die Struktur zu verfolgen, und Sie können im Handumdrehen mehrere Millionen Büros bearbeiten.

Nichts davon hat viel mit der Datenmenge zu tun. Der Schlüssel ist die Art der Organisation der Daten. Wenn ein relationales Layout hilft, ist ein RDBMS genau das, was Sie wollen. Wenn nicht, wird irgendeine Art von Massenspeicher etwas bis zu einer Billiarde Mal schneller sein.

Beachten Sie, dass Ihre Nicht-SQL-Datenbank nicht mehr funktioniert, wenn einer dieser Datensätze zu groß wird, um in den Arbeitsspeicher zu passen. Ein weiteres Problem ist, wenn Sie Daten von mehr als einem Block gleichzeitig benötigen. Sie können dies tun , wenn , und nur wenn alle Blöcke passen auf einmal im Speicher. Und der Benutzer muss warten, während Sie sie laden.

Wenn Ihre relationale Datenbank zu Problemen führen kann, geschieht dies, bevor Sie viele Daten in die Datenbank geschrieben haben. Das einzige Skalierungsproblem, das Sie möglicherweise haben, besteht in Ihrem Programm, wenn der Datenblock, den Sie für eine nosql-Datenbank zusammenstellen - wenn Sie einen verwenden müssen - zu groß dafür wird. (Informieren Sie sich über Speicherfehler. Die neueren Sprachen haben manchmal seltsame Probleme mit dem Speicher.)

RalphChapin
quelle
0

Ich denke, der erste Grund für eine NoSQL- oder Distributed-Lösung ist nicht die Größe aller Daten, sondern die Größe der Tabellen. Was verteilte Lösungen gut machen, ist das Aufteilen von Tabellen auf verschiedene Knoten. Wenn Sie dann die Tabellen abfragen müssen, verarbeitet jeder Knoten seinen Teil der Tabelle.

RDBMSs können dies, aber die neue Welle von NoSQL-Datenbanken wurde dafür erstellt. Oracle, MSSQL und MySQL haben ihr zentrales Modell angepasst, damit es in einer verteilten Umgebung funktioniert. Sie halten sich jedoch weiterhin an strenge ACID-Regeln, während einige der neuen Datenbanken die strengen Regeln nicht einhalten, z.

Es gibt keine festgelegte Datenmenge, bei der Sie eine über der anderen auswählen sollten. Was berücksichtigt werden muss, sind die Anforderungen der Datenbank und die Menge der Nutzung, die sie erhält. NoSQL-Datenbanken können größere Datenmengen schneller verarbeiten, während relationale Datenbanken Ihnen das Vertrauen geben, dass Ihre Daten den ACID-Grundsätzen entsprechen.

DFord
quelle
0

Es kann auch erwähnenswert sein, dass Ihr Datenmodell einen großen Einfluss auf die Dinge hat. Wenn Sie feststellen, dass Sie eine Form von Baumstruktur erstellen müssen (dh, Sie haben einen selbstreferenzierenden Fremdschlüssel in einer Tabelle, die den Fremdschlüssel in einem zusammengesetzten Primärschlüssel enthält), sollten Sie dies wahrscheinlich in einer Form von Datenbank prüfen, die diese behandelt Arten von Daten wirklich gut (wie Mongodb oder Couchdb).

Wie andere Leute gesagt haben, sollten Sie auch berücksichtigen, was in Ihrer Anwendung passiert. Wenn Sie wirklich ACID für mehrere Tabellen benötigen, müssen Sie sich wirklich an ein RDBMS halten, aber wenn Sie etwas haben, bei dem Sie veraltete Daten haben können, und Sie die Flexibilität eines NoSQL-Schemas benötigen (nennen Sie es schemenlos, wenn Sie möchten, aber es hat immer noch eine Form von implizitem Schema), dann könnten Sie überlegen, einen NoSQL-Store zu kaufen ( http://www.10gen.com/customers/craigslist hier ist ein Beispiel dafür, warum Craigslist umgestellt wurde ... aber zugegebenermaßen archivieren sie ~ 10 TB von Daten, von denen ich weiß, dass sie überhaupt nicht in Ihre kleine bis mittlere Datenbankgröße passen, aber der Anwendungsfall könnte hilfreich sein).

Denken Sie daran, dass NoSQL-Systeme nicht unbedingt RDMS ersetzen müssen. In vielen Fällen können Sie jedoch Ihr RDBMS durch Polyglot Persistence ergänzen und die meisten Ihrer Daten in einem RDBMS speichern. In bestimmten Nischeninstanzen können Sie jedoch einige Ihrer Daten auslagern Daten in eine Form von NoSQL-Speicher.

harageth
quelle
0

Mongokann auf mehreren Computern / Knoten installiert werden. BietetPostgreSQL kein integriertes Tool zum Zersplittern, aber Citus ist in der Nähe .

MongoDB unterstützt Datenbanken mit bis zu 64 Terabyte und eine Dokumentgröße von 16 Megabyte.

MySQL hat ein Datenbanklimit von 256 Terabyte, 64 Terabyte die maximale Größe für eine Tabelle und ein Datensatzlimit von 4 Gigabyte

PostgreSQL hat keine Begrenzung für die Datenbank (4 Terabyte sind zum Testen vorhanden) und es gibt eine Begrenzung von 1 Gigabyte für die Größe eines Felds in einer Tabelle und wiederum 64 Terabyte für die maximale Größe einer Tabelle.

Jewgenij Afanasjew
quelle