Warum NICHT partitionieren?

10

Wann möchte man eine Datenbank NICHT partitionieren? (Denken Sie an MySQL-Partitionierung )

In meinem Fall

  • Ich werde mit ein paar Millionen Zeilen beginnen, es sollte von dort wachsen.
  • Primärschlüssel in einem Zeichenfeld, das als häufigste Einschränkung für Abfragen dient (und Suchvorgänge sind häufig - mindestens einige pro Sekunde).
  • Der Primärschlüssel wird als Partitionsschlüssel gehasht
  • Jede Zeile, die in den oben genannten häufigen Abfragen abgerufen wird, wird aktualisiert
  • Weniger häufige Suchvorgänge (anhand von Datumsspalten oder anderen) müssen alle Partitionen treffen

Läuft die Suche nicht bis zum letzten Punkt parallel , ist dies also in allen Fällen ein Gewinn ? Was sind die Nachteile der Partitionierung? Warum ist es nicht etwas, das JEDER standardmäßig verwendet, zumindest wenn Sie mehr als eine Million Datensätze betrachten?

UPDATE - Ich habe die Antwort von zgguy ausgewählt, aber beachten Sie, dass ich meine eigene Antwort mit den Ergebnissen meiner eigenen Forschung hinzugefügt habe, einschließlich eines Links zu einer wirklich guten Antwort auf eine ähnliche Frage, die für mich sehr nützlich war.

chell
quelle

Antworten:

5

Es gibt keine Silberkugel für Leistungsprobleme, und Partitionierung ist auch keine.

Jede Partition ist im Wesentlichen eine Tabelle für sich. Daher werden Abfragen, die so geschrieben sind, dass die Datenbank nur in einer Partition nach Zeilen suchen kann, schneller. Der Unterschied kann bei Abfragen, die die gesamte große Tabelle scannen müssten, sehr groß sein, kann sich jedoch darauf beschränken, nur eine Partition in der partitionierten Tabelle zu scannen. Bei eindeutigen Schlüsselsuchen ist der Unterschied viel geringer.

Abfragen, bei denen Indexsuchen so verwendet werden, dass die Datenbank alle oder die meisten Tabellenpartitionen (Indexpartitionen) besuchen muss, werden jedoch erheblich langsamer ausgeführt.

Parallele Ausführung ist ein Thema für sich. Wenn Sie große Chargen über Nacht ausführen und die gesamte Maschine für diesen einzelnen Job benötigt, ist die Parallelisierung eine gute Sache. In einem OLTP-System, in dem die Datenbank ständig Abfragen von vielen gleichzeitigen Benutzern bearbeitet, möchten Sie jedoch nicht, dass ein Benutzer alle Ressourcen belegt.

zgguy
quelle
Die Suche nach eindeutigen / Primärschlüsseln wird also nicht wesentlich (wenn überhaupt?) Verbessert, da der PK-Index schneller ist. Ist das allgemein so - gibt es Zeiten, in denen ein PK-Index langsamer ist? Was ist, wenn Suchvorgänge auf neu hinzugefügte PKs verschoben werden? Wäre eine auf der PK basierende Partition (ich denke, der Partitionsschlüssel algo müsste ein Modul oder ähnliches und KEIN Hash sein, oder?), Die bewirkt, dass die meisten Aktivitäten nur eine Partition treffen, hilfreich sein?
Chell
Bei der Suche nach Primär- / eindeutigen Schlüsseln wird bestenfalls eine geringfügige Leistungsverbesserung festgestellt. Wenn Sie andererseits die Konkurrenz von DML-Anweisungen reduzieren möchten, sollten Sie die Partition so partitionieren, dass DML gleichmäßig auf alle Partitionen verteilt ist, anstatt sich auf wenige von ihnen zu konzentrieren.
Zgguy
Es tut mir leid, 10 Tage später wiederzukommen, aber Sie sprechen einen wichtigen Punkt an. Sie haben einen guten Grund angegeben, die Partitionierung als möglicherweise nicht erforderlich anzusehen . In meinem Szenario wird jedoch jeder Datensatz nach dem Lesen aktualisiert (mehrere pro Sekunde). Ist der Bedarf an so vielen Schreibvorgängen für Partitionen (mit gleichmäßiger Verteilung) überzeugender, sodass die Schreiblast verteilt ist?
Chell
Ich versuche auch, Ihren Kommentar zu Abfragen zu verstehen, die viele Partitionen treffen (die langsamer sind). Wenn Abfragen gegen die PK gerichtet sind, die auch als Partitionsschlüssel verwendet wird (Hash), weiß die Datenbank dann nicht sofort, zu welcher Partition sie gehen soll, basierend auf dem Hash der Suche? Danke für die Hilfe!
Chell
Leider konnte ich Stack Exchange in letzter Zeit nicht besuchen. Die Antwort, auf die Sie verlinkt haben, ist großartig. Ich glaube, es beantwortet Ihre beiden Fragen.
Zgguy
2

Die Antwort hier ist gut geschrieben und enthält ähnliche Argumente wie die Antwort von zgguy. Wenn Sie durch Partitionierung nicht viel davon profitieren, profitieren Sie von einem Szenario mit nur einer Maschine, bei dem die häufigsten Suchvorgänge auf dem Primärschlüssel oder ähnlichem basieren (weil indizierte Suchvorgänge sollten genauso schnell sein).

Tatsächlich scheint ein allgemeiner Ratschlag zu sein, dass der Hauptgrund für die Partitionierung tangential und hauptsächlich verwaltungsbezogen ist: Trennen Sie Ihre Daten beispielsweise nach Datum, wenn Sie von Zeit zu Zeit alte Datensätze löschen müssen. Obwohl festgestellt wurde, dass dies auch Ihrer Suchleistung zugute kommen kann, wenn Ihre Daten so sind, dass fast alle Abfragen nur kürzlich hinzugefügte Datensätze treffen.

Ich habe auch erwähnt, dass MySQL niemals etwas parallel macht (wäre schön, einige Links oder weitere Erklärungen dazu zu sehen).

Ich habe noch niemanden gesehen, der darüber gesprochen hat, ob Schreibaktivitäten unterschiedliche Überlegungen hinzufügen oder nicht.

chell
quelle
Ich glaube nicht, dass Schreiben Ihre Antwort ändern. Sie haben 2 der 4 Anwendungsfälle erwähnt , die ich gefunden habe. Immer noch keine Parallelität, auch in 8.0.
Rick James
1

Das allererste, was mir in den Sinn kommt, ist das Beschneiden von Partitionen . Wenn dies nicht der Fall ist, können Ihre Abfragen dies verwenden.

Benötigen Sie das Löschen einer großen Datenmenge aus der Tabelle, da die Partitionierung Ihnen helfen würde? Obwohl alt, aber dieser Beitrag von Peter hat wenige Punkte zu beachten.

und eine andere Sache, die man sich vorstellen kann, ist die Benutzerfreundlichkeit für einfache Tabellen ... Die Partitionierung erfordert zusätzliche Arbeit und Wartung.

mysql_user
quelle
Neuere Versionen haben eine Syntax zum expliziten Beschränken der Abfrage auf eine Partition. Ich kann mir keinen triftigen Grund vorstellen, jemals einen solchen zu benutzen.
Rick James