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.
quelle
Antworten:
Wie groß sind die Daten?
Es gibt zwei signifikante Schwellenwerte:
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.
quelle
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.
quelle
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.)
quelle
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.
quelle
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.
quelle
Mongo
kann 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.
quelle