Wie groß kann eine MySQL-Datenbank werden, bevor sich die Leistung verschlechtert?


303

Ab wann verliert eine MySQL-Datenbank an Leistung?

  • Ist die Größe der physischen Datenbank wichtig?
  • Ist die Anzahl der Datensätze wichtig?
  • Ist eine Leistungsverschlechterung linear oder exponentiell?

Ich habe eine meiner Meinung nach große Datenbank mit ungefähr 15 Millionen Datensätzen, die fast 2 GB belegen. Gibt es aufgrund dieser Zahlen einen Anreiz für mich, die Daten zu bereinigen, oder kann ich sicher sein, dass sie noch einige Jahre weiter skaliert werden?

Antworten:


204

Die Größe der physischen Datenbank spielt keine Rolle. Die Anzahl der Datensätze spielt keine Rolle.

Nach meiner Erfahrung ist das größte Problem, auf das Sie stoßen werden, nicht die Größe, sondern die Anzahl der Abfragen, die Sie gleichzeitig bearbeiten können. Höchstwahrscheinlich müssen Sie zu einer Master / Slave-Konfiguration wechseln, damit die Leseabfragen für die Slaves und die Schreibabfragen für den Master ausgeführt werden können. Wenn Sie jedoch noch nicht dazu bereit sind, können Sie Ihre Indizes jederzeit für die von Ihnen ausgeführten Abfragen optimieren, um die Antwortzeiten zu verkürzen. Außerdem können Sie unter Linux viele Änderungen am Netzwerkstapel und am Kernel vornehmen, die Ihnen helfen werden.

Ich hatte meine bis zu 10 GB, mit nur einer moderaten Anzahl von Verbindungen und es hat die Anfragen gut behandelt.

Ich würde mich zuerst auf Ihre Indizes konzentrieren und dann einen Serveradministrator auf Ihr Betriebssystem untersuchen lassen. Wenn all dies nicht hilft, ist es möglicherweise an der Zeit, eine Master / Slave-Konfiguration zu implementieren.


Was ist, wenn die Datenbankgröße größer als 7 GB ist? In der Tat wird das Zeitlimit nicht bewirkt?
Hacker

89

Im Allgemeinen ist dies ein sehr subtiles Thema und überhaupt nicht trivial. Ich empfehle Ihnen, mysqlperformanceblog.com und High Performance MySQL zu lesen . Ich denke wirklich, dass es dafür keine allgemeine Antwort gibt.

Ich arbeite an einem Projekt mit einer MySQL-Datenbank mit fast 1 TB Daten. Der wichtigste Skalierbarkeitsfaktor ist RAM. Wenn die Indizes Ihrer Tabellen in den Speicher passen und Ihre Abfragen stark optimiert sind, können Sie mit einem durchschnittlichen Computer eine angemessene Anzahl von Anforderungen bearbeiten.

Die Anzahl der Datensätze spielt eine Rolle, je nachdem, wie Ihre Tabellen aussehen. Es ist ein Unterschied, viele Varchar-Felder oder nur ein paar Ints oder Longs zu haben.

Auch die physische Größe der Datenbank spielt eine Rolle: Denken Sie beispielsweise an Backups. Abhängig von Ihrer Engine wachsen Ihre physischen Datenbankdateien weiter, aber schrumpfen nicht, zum Beispiel mit innodb. Das Löschen vieler Zeilen hilft also nicht, Ihre physischen Dateien zu verkleinern.

Es gibt viel zu diesem Thema und wie in vielen Fällen steckt der Teufel im Detail.


45

Die Datenbankgröße spielt eine Rolle . Wenn Sie mehr als eine Tabelle mit mehr als einer Million Datensätzen haben, nimmt die Leistung tatsächlich ab. Die Anzahl der Datensätze wirkt sich natürlich auf die Leistung aus: MySQL kann bei großen Tabellen langsam sein . Wenn Sie eine Million Datensätze erreichen, treten Leistungsprobleme auf, wenn die Indizes nicht richtig eingestellt sind (z. B. keine Indizes für Felder in "WHERE-Anweisungen" oder "ON-Bedingungen" in Joins). Wenn Sie 10 Millionen Datensätze erreichen, werden Sie Leistungsprobleme bekommen, selbst wenn Sie alle Ihre Indizes richtig haben. Hardware-Upgrades - Hinzufügen von mehr Speicher und mehr Prozessorleistung, insbesondere Speicher - tragen häufig dazu bei, die schwerwiegendsten Probleme zu reduzieren, indem die Leistung zumindest bis zu einem gewissen Grad erneut erhöht wird. Beispielsweise37 Signale gingen von 32 GB RAM auf 128 GB RAM für den Basecamp-Datenbankserver über.


23

Ich würde mich zuerst auf Ihre Indizes konzentrieren, dann einen Serveradministrator auf Ihr Betriebssystem schauen lassen, und wenn all das nicht hilft, könnte es Zeit für eine Master / Slave-Konfiguration sein.

Das ist richtig. Eine andere Sache, die normalerweise funktioniert, besteht darin, nur die Datenmenge zu reduzieren, mit der wiederholt gearbeitet wird. Wenn Sie "alte Daten" und "neue Daten" haben und 99% Ihrer Abfragen mit neuen Daten arbeiten, verschieben Sie einfach alle alten Daten in eine andere Tabelle - und sehen Sie sie sich nicht an;)

-> Schauen Sie sich die Partitionierung an .


21

2 GB und ungefähr 15 Millionen Datensätze sind eine sehr kleine Datenbank - ich habe viel größere auf einem Pentium III (!) Ausgeführt und alles ist immer noch ziemlich schnell gelaufen. Wenn Ihre langsam ist, handelt es sich um ein Datenbank- / Anwendungsdesignproblem, nicht um ein MySQL einer.


20

Es ist irgendwie sinnlos, von "Datenbankleistung" zu sprechen, "Abfrageleistung" ist hier ein besserer Begriff. Die Antwort lautet: Dies hängt von der Abfrage, den Daten, den Indizes, der Hardware usw. ab. Sie können sich ein Bild davon machen, wie viele Zeilen gescannt werden und welche Indizes mit der EXPLAIN-Syntax verwendet werden.

2 GB zählen nicht wirklich als "große" Datenbank - sie sind eher mittelgroß.


11

Ich verwalte derzeit eine MySQL-Datenbank in der Cloud-Infrastruktur von Amazon, die auf 160 GB angewachsen ist. Die Abfrageleistung ist in Ordnung. Was zu einem Albtraum geworden ist, sind Backups, Wiederherstellungen, Hinzufügen von Slaves oder alles andere, was den gesamten Datensatz oder sogar DDL in großen Tabellen betrifft. Ein sauberer Import einer Dump-Datei ist problematisch geworden. Um den Prozess stabil genug für die Automatisierung zu machen, mussten verschiedene Entscheidungen getroffen werden, um Stabilität vor Leistung zu priorisieren. Wenn wir uns jemals mithilfe einer SQL-Sicherung von einer Katastrophe erholen müssten, wären wir tagelang außer Betrieb.

Die horizontale Skalierung von SQL ist ebenfalls sehr schmerzhaft und führt in den meisten Fällen dazu, dass SQL auf eine Weise verwendet wird, die Sie wahrscheinlich nicht beabsichtigt hatten, als Sie Ihre Daten überhaupt in SQL ablegten. Shards, Read Slaves, Multi-Master usw. sind allesamt wirklich beschissene Lösungen, die alles, was Sie jemals mit der DB tun, komplexer machen, und keiner von ihnen löst das Problem. mildert es nur in gewisser Weise. Ich würde dringend empfehlen, einige Ihrer Daten aus MySQL (oder wirklich jedem SQL) zu entfernen, wenn Sie sich einem Datensatz einer Größe nähern, bei dem diese Art von Dingen zu einem Problem wird.


aus MySQL in ein anderes MySQL verschieben?
Pacerier

In einen nicht relationalen Datenspeicher. Relationale Datenbanken lassen sich grundsätzlich nicht skalieren, ohne Ausfallzeiten zu verursachen oder das relationale Modell zu beschädigen. Wenn Sie das relationale Modell brechen möchten, ist es besser, die Verwendung einer relationalen Datenbank zu beenden. Erstellen Sie stattdessen speziell erstellte Dokumente und fügen Sie sie in eine Dokumentenspeicher-Engine wie CouchDB oder ein anderes System ein.
Rich Remer vor

10

Achten Sie auch auf komplexe Verknüpfungen. Die Transaktionskomplexität kann neben dem Transaktionsvolumen ein wichtiger Faktor sein.

Das Refactoring schwerer Abfragen bietet manchmal einen großen Leistungsschub.


9

Ich wurde einmal aufgefordert, mir ein MySQL anzusehen, das "nicht mehr funktioniert". Ich habe festgestellt, dass sich die DB-Dateien auf einem mit NFS2 gemounteten Network Appliance-Filer mit einer maximalen Dateigröße von 2 GB befinden. Und tatsächlich war die Tabelle, die keine Transaktionen mehr akzeptierte, genau 2 GB groß. Aber in Bezug auf die Leistungskurve wurde mir gesagt, dass es wie ein Champion funktioniert hat, bis es überhaupt nicht funktioniert hat! Diese Erfahrung dient mir immer als nette Erinnerung daran, dass es immer Dimensionen über und unter denen gibt, die Sie natürlich vermuten.


3
Es stimmt zwar, dass das Problem der Skalierung am besten ganzheitlich betrachtet wird, aber dies hängt überhaupt nicht damit zusammen, wie MySQL selbst skaliert.
Lie Ryan

9

Ein zu berücksichtigender Punkt ist auch der Zweck des Systems und der Daten im Alltag.

Beispielsweise sind für ein System mit GPS-Überwachung von Autos keine relevanten Abfragedaten von den Positionen des Autos in früheren Monaten.

Daher können die Daten zur möglichen Abfrage an andere historische Tabellen übergeben und die Ausführungszeiten der täglichen Abfragen verkürzt werden.


5

Die Leistung kann sich in wenigen tausend Zeilen verschlechtern, wenn die Datenbank nicht ordnungsgemäß entworfen wurde.

Wenn Sie über geeignete Indizes verfügen, geeignete Engines verwenden (verwenden Sie MyISAM nicht, wenn mehrere DMLs erwartet werden), Partitionierung verwenden, je nach Verwendung den richtigen Speicher zuweisen und natürlich eine gute Serverkonfiguration haben, kann MySQL Daten sogar in Terabyte verarbeiten!

Es gibt immer Möglichkeiten, die Datenbankleistung zu verbessern.


3

Dies hängt von Ihrer Anfrage und Validierung ab.

Zum Beispiel habe ich mit einer Tabelle von 100 000 Medikamenten gearbeitet, die einen generischen Spaltennamen hat, in dem mehr als 15 Zeichen für jedes Medikament in dieser Tabelle enthalten sind. Ich habe eine Abfrage gestellt, um den generischen Namen von Medikamenten zwischen zwei Tabellen zu vergleichen. Die Abfrage dauert Weitere Minuten zum Ausführen. Wenn Sie die Arzneimittel anhand des Arzneimittelindex und einer ID-Spalte (wie oben angegeben) vergleichen, dauert dies nur wenige Sekunden.


1

Die Datenbankgröße spielt eine Rolle in Bezug auf Bytes und die Zeilennummer der Tabelle. Sie werden einen großen Leistungsunterschied zwischen einer Light-Datenbank und einer mit Blobs gefüllten feststellen. Einmal blieb meine Anwendung hängen, weil ich Binärbilder in Felder einfügte, anstatt Bilder in Dateien auf der Festplatte zu speichern und nur Dateinamen in die Datenbank aufzunehmen. Das Iterieren einer großen Anzahl von Zeilen ist dagegen nicht kostenlos.


0

Nein, es spielt keine Rolle. Die MySQL-Geschwindigkeit beträgt ungefähr 7 Millionen Zeilen pro Sekunde. Sie können es also ziemlich skalieren


Hast du eine Quelle dazu?
Shobi

Vergessen wir nicht, dass die Einfügungen pro Sekunde vom Typ Ihres Computers abhängen (CPU-Leistung und Festplattengeschwindigkeit). Bei meinen informellen Tests sah ich auf beschissenen Laptops 100 Einsätze pro Sekunde und auf leistungsstärkeren SSD-basierten Laptops bis zu 2000 Einsätze pro Sekunde. Mit anderen Worten, dies ist eine hypothetische und unzuverlässige Metrik.
ankush981

0

Die Abfrageleistung hängt hauptsächlich von der Anzahl der zu scannenden Datensätze ab, Indizes spielen eine große Rolle und die Größe der Indexdaten ist proportional zur Anzahl der Zeilen und zur Anzahl der Indizes.

Abfragen mit indizierten Feldbedingungen zusammen mit dem vollen Wert werden im Allgemeinen in 1 ms zurückgegeben, aber Starts_with, IN, Between enthält offensichtlich Bedingungen, die möglicherweise mehr Zeit in Anspruch nehmen, wenn mehr Datensätze gescannt werden.

Außerdem treten bei DDL viele Wartungsprobleme auf, wie z. B. ALTER. DROP ist langsam und schwierig, da mehr Live-Datenverkehr vorhanden ist, selbst wenn ein Index oder neue Spalten hinzugefügt werden.

Im Allgemeinen ist es ratsam, die Datenbank in so viele Cluster wie erforderlich zu gruppieren (500 GB wären ein allgemeiner Maßstab, wie von anderen gesagt, hängt von vielen Faktoren ab und kann je nach Anwendungsfall variieren), um eine bessere Isolation und Unabhängigkeit bei der Skalierung zu erzielen Cluster (besser geeignet für B2B)

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.