Wie sich die Datenbankgröße auf die Leistung auswirkt: Theorie vs. Realität

9

Es gibt eine Menge, die besagt, dass die Datenbankgröße die Leistung nicht in hohem Maße beeinträchtigen sollte. Solange Indizes für Tabellen in den Speicher passen, sollte die Datenbank performant bleiben.

Was ist jedoch die Realität? Wenn die Datenbankarchitektur nicht die beste ist, die Indizes nicht in den Speicher passen und möglicherweise viele redundante Daten vorhanden sind, können durch einfaches Löschen redundanter Daten erhebliche Vorteile erzielt werden? Ich schätze, dass 60-80% der Daten in meiner Datenbank gelöscht werden könnten.

Ich glaube, dass das Reduzieren der Datenbankgröße und das Erhöhen des Arbeitsspeichers, damit Indizes in den Speicher passen, eine signifikante Leistungssteigerung bedeuten würde, die ein paar Monate Zeit zum Atmen geben würde, um das System neu zu gestalten.

Gibt es auch andere Faktoren wie E / A, Fragmentierung, Arbeitsdatensatz usw., die die Leistung basierend auf der Datenbankgröße beeinflussen?

Oliver P.
quelle
Obwohl Verallgemeinerungen zutreffen, wie groß ist die jeweilige Datenbank, mit der Sie sich befassen?
Mark Storey-Smith
Die fragliche DB-Größe liegt bei 600 GB.
Oliver P

Antworten:

8

Es hängt ganz davon ab, was Sie mit den Daten machen.

Bei grundlegenden Transaktionen zum Einfügen / Aktualisieren / Löschen, die nur wenige Zeilen betreffen, spielt das Wachstum der Datengröße wahrscheinlich keine große Rolle. Die Datenbank verwendet In-Memory-Indizes, um auf die richtige Seite zuzugreifen. Sie erhalten mehr Cache-Fehler, wenn die Tabellen nicht mehr in den Speicher passen. Der Overhead kann jedoch gering sein - abhängig von der Datenbank, den Datenbankkonfigurationen und den Hardwarekonfigurationen.

Wenn Sie Abfragen durchführen, für die vollständige Tabellenscans erforderlich sind, steigt Ihre Leistung linear oder schlechter mit der Datengröße. Indizes können die Situation tatsächlich verschlimmern, indem sie Seitenzugriffe zufällig auswählen, was dann so gut wie Cache-Fehlschläge garantiert.

Eine Alternative zu mehr Speicher ist die verbesserte Festplattengeschwindigkeit - Solid-State-Festplatten können eine enorme Verbesserung bieten.

Nur mehr Daten zu haben, wirkt sich wahrscheinlich nicht auf die Leistung aus, es sei denn, die Tabellen werden in Abfragen verwendet. Sind die Daten innerhalb einer Tabelle oder über Tabellen hinweg redundant? Große Tische zu haben, die nie benutzt werden, ist chaotisch, hat aber nur minimale Auswirkungen auf die Leistung. Es ist vorstellbar, dass das Kompilieren von Abfragen länger dauern kann, wenn Sie über zig unnötige Tabellen verfügen.

Gordon Linoff
quelle
2

Die Optimierungsregel AMM (Add More Memory) Nummer eins ist einfach. Es ist auch sehr kostspielig und am Ende nicht effektiv, wenn es Probleme mit der Selektivität gibt. Selbst wenn eine Datenbank vollständig in den Speicher passt, kann die Leistung der Anwendung schlecht sein. Im schlimmsten Fall aufgrund von Sperren und Verriegeln während sehr selektiver SQL-Ausführungen. Diese sollten zuerst behoben werden. Ein Grund ist die Parallelität, die dem Schlagen und Halten der Unterbrechungen gleicht, wenn jedes SQL jedes Mal auf alle Daten in einer Tabelle zugreift.

Stellen Sie sicher, dass kein SQL auf mehr Zeilen als erforderlich zugreift. Dies ist der effektivste Weg, um die Leistung gut zu halten. Eine normale Datenbank kann mit Io umgehen und führt eine Art Caching der am häufigsten verwendeten Daten durch.

Wenn Ihre Anwendung bereits alle möglichen Zugriffe minimiert hat und Sie bereits die schnellsten Festplattensysteme verwenden, sollten Sie echte Flash-Speicher-Arrays verwenden. Sie können die Leistung auf einem anderen Niveau steigern.

ik_zelf
quelle
1

Bitte beziehen Sie sich auf diese Beiträge:

Tipps, um Ihre Daten so klein wie möglich zu halten:

Entwerfen Sie Ihre Tabellen so, dass ihr Speicherplatz auf der Festplatte minimiert wird. Dies kann zu enormen Verbesserungen führen, indem die Datenmenge reduziert wird, die auf die Festplatte geschrieben und von dieser gelesen wird. Kleinere Tabellen benötigen normalerweise weniger Hauptspeicher, während ihr Inhalt während der Ausführung der Abfrage aktiv verarbeitet wird. Jede Speicherplatzreduzierung für Tabellendaten führt auch zu kleineren Indizes, die schneller verarbeitet werden können.

MySQL unterstützt viele verschiedene Speicher-Engines (Tabellentypen) und Zeilenformate. Für jede Tabelle können Sie entscheiden, welche Speicher- und Indizierungsmethode verwendet werden soll. Wenn Sie das richtige Tabellenformat für Ihre Anwendung auswählen, können Sie einen großen Leistungsgewinn erzielen.

Mit den hier aufgeführten Techniken können Sie eine bessere Leistung für eine Tabelle erzielen und den Speicherplatz minimieren: - Verwenden Sie die effizientesten (kleinsten) Datentypen, die möglich sind. MySQL verfügt über viele spezielle Typen, die Speicherplatz und Speicherplatz sparen. Verwenden Sie beispielsweise nach Möglichkeit die kleineren Ganzzahltypen, um kleinere Tabellen zu erhalten. MEDIUMINT ist oft die bessere Wahl als INT, da eine MEDIUMINT-Spalte 25% weniger Speicherplatz benötigt.

  • Deklarieren Sie Spalten nach Möglichkeit als NICHT NULL. Es macht alles schneller und Sie sparen ein Bit pro Spalte. Wenn Sie in Ihrer Anwendung wirklich NULL benötigen, sollten Sie es auf jeden Fall verwenden. Vermeiden Sie es einfach, es standardmäßig in allen Spalten zu haben.

  • Wenn Sie für MyISAM-Tabellen keine Spalten variabler Länge (VARCHAR-, TEXT- oder BLOB-Spalten) haben, wird ein Zeilenformat mit fester Größe verwendet.

  • InnoDB-Tabellen verwenden ein kompaktes Speicherformat. In früheren Versionen von MySQL als 5.0.3 enthalten InnoDB-Zeilen einige redundante Informationen, z. B. die Anzahl der Spalten und die Länge jeder Spalte, selbst für Spalten mit fester Größe. Standardmäßig werden Tabellen im kompakten Format (ROW_FORMAT = COMPACT) erstellt. Durch das Vorhandensein des kompakten Zeilenformats wird der Speicherplatz in den Zeilen um etwa 20% verringert, wodurch die CPU-Auslastung für einige Vorgänge erhöht wird. Wenn Ihre Arbeitslast typisch ist und durch die Cache-Trefferquote und die Festplattengeschwindigkeit begrenzt ist, ist sie wahrscheinlich schneller. Wenn es ein seltener Fall ist, der durch die CPU-Geschwindigkeit begrenzt ist, ist er möglicherweise langsamer.

Das kompakte InnoDB-Format ändert auch, wie CHAR-Spalten mit UTF-8-Daten gespeichert werden. Mit ROW_FORMAT = REDUNDANT belegt ein UTF-8 CHAR (N) 3 × N Bytes, vorausgesetzt, die maximale Länge eines UTF-8-codierten Zeichens beträgt drei Bytes. Viele Sprachen können hauptsächlich mit Einzelbyte-UTF-8-Zeichen geschrieben werden, sodass eine feste Speicherlänge häufig Speicherplatz verschwendet. Mit dem Format ROW_FORMAT = COMPACT weist InnoDB diesen Spalten eine variable Speichermenge im Bereich von N bis 3 × N Byte zu, indem bei Bedarf nachfolgende Leerzeichen entfernt werden. Die minimale Speicherlänge wird als N Byte beibehalten, um in typischen Fällen direkte Aktualisierungen zu ermöglichen.

  • Der Primärindex einer Tabelle sollte so kurz wie möglich sein. Dies macht die Identifizierung jeder Zeile einfach und effizient

  • Erstellen Sie nur die Indizes, die Sie wirklich benötigen. Indizes sind gut zum Abrufen, aber schlecht, wenn Sie Daten schnell speichern müssen. Wenn Sie auf eine Tabelle zugreifen, indem Sie hauptsächlich nach einer Kombination von Spalten suchen, erstellen Sie einen Index für diese. Der erste Teil des Index sollte die am häufigsten verwendete Spalte sein. Wenn Sie bei der Auswahl aus der Tabelle immer viele Spalten verwenden, sollte die erste Spalte im Index diejenige mit den meisten Duplikaten sein, um eine bessere Komprimierung des Index zu erzielen.

  • Unter bestimmten Umständen kann es vorteilhaft sein, eine Tabelle, die sehr oft gescannt wird, in zwei Teile zu teilen. Dies gilt insbesondere dann, wenn es sich um eine Tabelle mit dynamischem Format handelt und eine kleinere Tabelle mit statischem Format verwendet werden kann, mit der beim Scannen der Tabelle die relevanten Zeilen gefunden werden können.

Mahesh Patil
quelle