it-swarm.com.de

Bei welcher Datengröße ist es vorteilhaft, von SQL zu NoSQL zu wechseln?

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

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

(Ich weiß, dass dies von der Anwendung und der Art der gespeicherten Daten abhängen wird. Diejenige, die mich dazu gebracht hat, war im Grunde eine Genetikdatenbank, also hätte ich eine Haupttabelle mit 3 oder 4 Nachschlagetabellen. Die Haupttabelle enthält darunter andere Dinge, eine Chromosomenreferenz und eine Positionskoordinate. Es wird wahrscheinlich nach einer Reihe von Einträgen zwischen zwei Tränken auf einem Chromosom abgefragt, um zu sehen, was dort gespeichert ist.

25
wobbily_col

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 weniger zum Problem, es sei denn, Sie haben verrückt hohen Datenverkehr.

Säure

Eines der Probleme bei der Skalierung von RDBMS besteht darin, dass es sich um ACID handelt, dh Transaktionen und Sperren auf Zeilenebene (oder sogar auf Tabellenebene in einigen älteren/einfacheren RDBMS). Dies kann ein begrenzender Faktor sein, wenn Sie viele Abfragen haben, die viele gleichzeitig ausgeführte Daten ändern. NoSQL-Lösungen verwenden normalerweise das Modell eventuelle Konsistenz .

Wie skaliert RDBMS auf die 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 grundsätzlich nicht verwandte Tabellen auf separaten DB-Servern gespeichert, sodass die Größe jeder Tabelle unter den oben genannten Schwellenwerten liegt. Dies macht das Verknüpfen dieser Tabellen mit einfachem SQL weniger einfach und weniger effizient.

Sharding bedeutet, Daten von einer Tabelle basierend auf einem bestimmten Schlüssel auf verschiedene Server zu verteilen. Dies bedeutet, dass Sie für Suchvorgänge wissen, welcher Server basierend auf diesem Schlüssel abgefragt werden muss. Dies erschwert jedoch Abfragen, bei denen es sich nicht um Suchvorgänge auf dem Sharding-Schlüssel handelt.

Wenn Sie bei beiden Partitionierungsarten zu Extremen gehen, haben Sie im Grunde die gleiche Situation wie bei NoSQL-Datenbanken.

14
vartec

Ich denke nicht, dass die Datengröße der einzige Faktor ist. "Datenmodell" ist ebenfalls 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 eine wichtigere Rolle als die Datengröße, wenn eine NoSQL-Lösung oder ein RDBMS in Betracht gezogen wird.

13
Chiron

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

SQL hat Probleme mit einigen Arten von Analysen, benötigt jedoch nicht viele Daten, um das Problem auszulösen. Stellen Sie sich beispielsweise eine einzelne Tabelle mit einer Spalte vor, die auf anderen Zeilen basierend auf einem eindeutigen Schlüssel verweist. In der Regel wird dies zum Erstellen einer Baumstruktur verwendet. Sie können schnelle SQL-Anweisungen schreiben, die auf die zugehörige Zeile verweisen. Oder die verwandte Zeile der zugehörigen Zeile. Tatsächlich können Sie eine beliebige Anzahl von Sprüngen ausführen. Wenn Sie jedoch für jede Zeile ein Feld in der ersten zugehörigen Zeile in der Kette auswählen möchten, das ein bestimmtes Kriterium erfüllt, wird dies kompliziert.

Betrachten Sie eine Tabelle mit Bürostandorten auf Landes-, Provinz-/Bundesland-, Kreis-, Stadt- und Dorfebene, wobei jedes Büro auf das Büro verweist, an das es berichtet. Es gibt nein Garantie, dass das Berichtsbüro jedes Büros nur eine Ebene höher ist. Für eine ausgewählte Gruppe von Ämtern, nicht alle auf einer Ebene, möchten Sie jedes zugeordnete nationale Büro auflisten. Dies erfordert Schleifen von SQL-Anweisungen und wird auch heute noch lange dauern. (Früher hatte ich 30 Sekunden Zeit für eine Auswahl von 30 Büros, aber das war vor langer Zeit - und das Umschalten auf gespeicherte 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 ein paar Millionen Büros bearbeiten.

Nichts davon hat viel mit der Datenmenge zu tun. Der Schlüssel ist die Art der Datenorganisation. Wenn ein relationales Layout hilft, ist ein RDBMS genau das, was Sie wollen. Wenn nicht, wird eine Art 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 Speicher zu passen. Ein weiteres Problem besteht darin, dass Sie Daten von mehr als einem Block gleichzeitig benötigen. Sie können dies tun if und nur if, wenn alle Blöcke gleichzeitig in den Speicher passen. Und der Benutzer muss warten, während Sie sie laden.

Wenn Ihre relationale Datenbank Probleme verursacht, wird dies geschehen, bevor Sie viele Daten in sie eingefügt haben. Das einzige Skalierungsproblem, das Sie möglicherweise haben, ist mit Ihrem Programm, wenn der Datenblock, den Sie für eine nosql-Datenbank zusammenstellen - falls Sie eine verwenden müssen - zu groß dafür wird. (Informieren Sie sich über Fehler aufgrund von Speichermangel. Die neueren Sprachen machen manchmal seltsame Dinge mit dem Speicher.)

6
RalphChapin

Ich denke, der erste Grund für eine NoSQL- oder Distributed-Lösung ist nicht so sehr die Größe aller Daten, sondern die Größe der Tabellen. Was verteilte Lösungen gut machen, ist, Tabellen auf verschiedene Knoten aufzuteilen. 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 übernommen und optimiert, 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. B. durch die Verwendung einer eventuellen Konsistenz.

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

0
DFord

Mongo kann auf mehreren Computern/Knoten installiert werden. PostgreSQL bietet kein eingebautes Tool zum Sharding, jedoch gibt es citus .

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 Beschränkung für die Datenbank (4 Terabyte existieren irgendwo zum Testen) und es gibt eine Beschränkung von 1 Gigabyte für die Größe eines Feldes in einem Tabelle und wieder 64 Terabyte die maximale Größe für eine Tabelle.

0

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

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

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

0
harageth