Mein Host verfügt nur über 100 GB Speicher. Wenn ich einen vollständigen Tabellenscan für eine 200 GB große Tabelle durchführen möchte, wird dann der Speicher des DB-Hosts aufgebraucht? Wird beim Durchführen einer logischen Sicherung nicht lediglich die gesamte Datenbank gescannt? Wenn dies passieren würde, wäre der gesamte Speicher verbraucht und die logische Sicherung wäre schon vor langer Zeit fehlgeschlagen, nicht wahr? Auswirkungen eines vollständigen Tabellenscans auf die ServerebeneAngenommen, wir möchten jetzt einen vollständigen Tabellenscan einer 200G InnoDB-Tabelle db1.t durchführen. Wenn Sie die Scan-Ergebnisse auf dem Client speichern möchten, verwenden Sie natürlich einen Befehl wie diesen: mysql -h$host -P$port -u$benutzer -p$pwd -e "Wählen Sie * aus db1.t" > $Zieldatei InnoDB-Daten werden im Primärschlüsselindex gespeichert, sodass ein vollständiger Tabellenscan tatsächlich direkt den Primärschlüsselindex der Tabelle t scannt. Da diese Abfrageanweisung keine weiteren Beurteilungsbedingungen hat, kann jede gefundene Zeile direkt in den Ergebnissatz eingefügt und dann an den Client zurückgegeben werden. Also, wo existiert dieser „Ergebnissatz“?
Abfrageergebnis-Sendeprozess sichtbar:
MySQL ist also tatsächlich ein „Lesen und Senden“. Dies bedeutet, dass der MySQL-Server die Ergebnisse nicht senden kann, wenn der Client die Daten langsam empfängt, und die Ausführungszeit der Transaktion länger ist. Der folgende Status ist beispielsweise das Ergebnis, das von „show processlist“ auf dem Server angezeigt wird, wenn der Client den Inhalt des Socket-Empfangspuffers nicht liest. Server sendet blockiert Wenn Sie sehen, dass der Status immer „An Client senden“ lautet, bedeutet dies, dass der Netzwerkstapel auf dem Server voll ist. Wenn der Client den Parameter –quick verwendet, wird die Methode mysql_use_result verwendet: Lesen Sie eine Zeile und verarbeiten Sie sie zeilenweise. Angenommen, die Logik eines bestimmten Geschäfts ist relativ komplex. Wenn die nach dem Lesen jeder Datenzeile zu verarbeitende Logik sehr langsam ist, dauert es lange, bis der Client die nächste Datenzeile abruft. Dies kann zu dem in der obigen Abbildung gezeigten Ergebnis führen. Wenn eine Abfrage im normalen Online-Geschäft nur wenige Ergebnisse zurückgibt, wird daher empfohlen, die Schnittstelle mysql_store_result zu verwenden, um die Abfrageergebnisse direkt im lokalen Speicher zu speichern. Voraussetzung ist natürlich, dass die Abfrage nur wenige Ergebnisse zurückgibt. Wenn es zu viele sind, belegt der Client fast 20 GB Speicher, weil eine große Abfrage ausgeführt wird. In diesem Fall müssen Sie stattdessen die Schnittstelle mysql_use_result verwenden. Wenn Sie in der MySQL-Datenbank, für deren Verwaltung Sie verantwortlich sind, viele Threads im Status „An Client senden“ sehen, bedeutet das, dass Sie Ihre Kollegen aus der Geschäftsentwicklung bitten sollten, die Abfrageergebnisse zu optimieren und zu beurteilen, ob so viele zurückgegebene Ergebnisse sinnvoll sind. Wenn Sie die Anzahl der Threads in diesem Zustand schnell reduzieren möchten, können Sie net_buffer_length auf einen größeren Wert setzen. Manchmal sehe ich auf der Instanz viele Abfrageanweisungen mit dem Status „Daten werden gesendet“, aber es liegen keine Netzwerkprobleme vor. Warum dauert das Senden von Daten so lange?
Das heißt, „Daten senden“ bedeutet nicht notwendigerweise „Daten senden“, sondern kann jede Phase im Ausführungsprozess bedeuten. Sie können beispielsweise ein Szenario zum Warten auf eine Sperre erstellen und den Status des Datenversands anzeigen. Das Lesen der gesamten Tabelle ist gesperrt:
Status der Datenübermittlung Es ist ersichtlich, dass Sitzung2 auf die Sperre wartet und der Status als „Daten werden gesendet“ angezeigt wird.
Daher werden die Abfrageergebnisse segmentweise an den Client gesendet, sodass das Scannen der gesamten Tabelle und die Rückgabe einer großen Datenmenge nicht zu einer Speicherexplosion führt. Das Obige ist die Verarbeitungslogik der Serverebene. Wie wird sie in der InnoDB-Engine gehandhabt? Auswirkungen eines vollständigen Tabellenscans auf InnoDBEine der Funktionen des InnoDB-Speichers besteht darin, Aktualisierungsergebnisse zu speichern und mit dem Redo-Log zusammenzuarbeiten, um zufällige Schreibvorgänge auf die Festplatte zu vermeiden. Die Datenseiten im Speicher werden im Pufferpool (kurz BP) verwaltet. In WAL übernimmt BP die Rolle der Aktualisierungsbeschleunigung. Aufgrund von WAL ist die Datenseite auf der Festplatte alt, wenn eine Transaktion festgeschrieben wird. Wenn eine Abfrage zum sofortigen Lesen der Datenseite vorliegt, sollte das Redo-Protokoll dann sofort auf die Datenseite angewendet werden? unnötig. Da zu diesem Zeitpunkt das Ergebnis der Speicherdatenseite am aktuellsten ist, können Sie die Speicherseite direkt lesen. Zu diesem Zeitpunkt muss die Abfrage die Festplatte nicht lesen und die Ergebnisse werden direkt aus dem Speicher abgerufen, was sehr schnell ist. Daher kann Buffer Pool Abfragen beschleunigen. Der Beschleunigungseffekt von BP auf Abfragen hängt von einem wichtigen Indikator ab, nämlich der Speichertrefferrate. Führen Sie „show engine innodb status“ aus. Anschließend werden die Worte „Buffer pool hit rate“ angezeigt, die die aktuelle Trefferquote zeigen. Beispielsweise beträgt die Trefferquote im Bild unten 100 %. Im besten Fall können alle von der Abfrage benötigten Datenseiten direkt aus dem Speicher geholt werden, das entspricht einer Trefferquote von 100%. Die Größe des InnoDB-Pufferpools wird durch den Parameter innodb_buffer_pool_size bestimmt. Es wird im Allgemeinen empfohlen, ihn auf 60 % bis 80 % des verfügbaren physischen Speichers einzustellen. Vor etwa zehn Jahren betrug die Datenmenge auf einer einzelnen Maschine Hunderte von GB, während der physische Speicher mehrere GB groß war. Heute hat die Datenmenge auf einer einzelnen Maschine das T-Niveau erreicht, obwohl viele Server über 128 GB oder sogar mehr Speicher verfügen. Daher ist innodb_buffer_pool_size häufig kleiner als die Datenmenge auf der Festplatte. Wenn ein Pufferpool voll ist und eine Datenseite von der Festplatte gelesen werden muss, muss eine alte Datenseite gelöscht werden. InnoDB-SpeicherverwaltungDer Least Recently Used (LRU)-Algorithmus wird verwendet, um die am längsten ungenutzten Daten zu eliminieren.
ZU TUN
Abschließend wird die Datenseite Pm gelöscht, auf die am längsten nicht zugegriffen wurde. Anschließend werden durch das Scannen gemäß diesem Algorithmus alle Daten im aktuellen BP gelöscht und die Inhalte der während des Scanvorgangs aufgerufenen Datenseiten gespeichert. Mit anderen Worten enthalten die Daten in BP hauptsächlich die Daten in dieser historischen Datentabelle. Für eine Bibliothek, die geschäftliche Dienste anbietet, ist dies nicht akzeptabel. Sie werden feststellen, dass die Trefferquote des BP-Speichers stark abfällt, der Festplattendruck zunimmt und die Antworten auf SQL-Anweisungen langsamer werden. Daher kann InnoDB das ursprüngliche LRU nicht direkt verwenden. InnoDB optimiert es. Verbesserter LRU-Algorithmus InnoDB teilt die verknüpfte Liste im Verhältnis 5:3 in den neuen und den alten Bereich auf. In der Abbildung zeigt LRU_old auf die erste Position des alten Bereichs, der 5/8 der gesamten verknüpften Liste ausmacht. Das bedeutet, dass 5/8 am Anfang der verknüpften Liste der neue Bereich ist und 3/8 am Ende der verknüpften Liste der alte Bereich ist. Verbesserter Ausführungsprozess des LRU-Algorithmus: 1. Status 1, um auf P3 zuzugreifen. Da sich P3 im neuen Bereich befindet, verschieben Sie es genau wie LRU vor der Optimierung an den Anfang der verknüpften Liste => Status 2
Diese Strategie ist auf die Handhabung von Vorgängen wie vollständigen Tabellenscans zugeschnitten. Oder scannen Sie die 200G-Historische Datentabelle: Es ist ersichtlich, dass der größte Vorteil dieser Strategie darin besteht, dass BP zwar auch beim Scannen dieser großen Tabelle verwendet wird, jedoch keine Auswirkungen auf den jungen Bereich hat und somit die Abfragetrefferquote des Pufferpools als Reaktion auf das normale Geschäft sichergestellt wird. ZusammenfassungMySQL verwendet die Logik des gleichzeitigen Berechnens und Sendens, sodass bei Abfrageergebnissen mit einer großen Datenmenge nicht der vollständige Ergebnissatz auf der Serverseite gespeichert wird. Wenn der Client die Ergebnisse nicht rechtzeitig liest, blockiert er daher den MySQL-Abfrageprozess, führt jedoch nicht zu einer Speicherexplosion. Bei der InnoDB-Engine kommt es aufgrund der Eliminierungsstrategie bei großen Abfragen nicht zu einem Anstieg der Speichernutzung. Da InnoDB außerdem den LRU-Algorithmus verbessert hat, können die Auswirkungen vollständiger Tabellenscans kalter Daten auf den Pufferpool kontrolliert werden. Vollständige Tabellenscans sind immer noch relativ IO-intensiv, sodass während der Geschäftsspitzenzeiten keine vollständigen Tabellenscans direkt auf der Online-Masterdatenbank durchgeführt werden können. Dies ist das Ende dieses Artikels darüber, ob zu viele MySQL-Datenabfragen OOM verursachen. Weitere relevante OOM-Inhalte zu MySQL-Datenabfragen finden Sie in früheren Artikeln auf 123WORDPRESS.COM oder durchsuchen Sie die folgenden verwandten Artikel weiter. Ich hoffe, dass jeder 123WORDPRESS.COM in Zukunft unterstützen wird! Das könnte Sie auch interessieren:
|
<<: Zusammenfassung der Fallstricke bei Virtualbox Centos7 NAT+Host-Only-Netzwerken
>>: Setzen Sie den Eingang auf schreibgeschützt über deaktiviert und schreibgeschützt
1. addtime() Füge die angegebene Anzahl Sekunden ...
Heute bin ich auf das MySQL-Dienstfehlerproblem 1...
Beim Anwenden von Docker-Containern mounten wir h...
In diesem Artikel wird die Zusammensetzung der Ha...
Das Endergebnis sieht so aus, ist es nicht süß … ...
Inhaltsverzeichnis 1. Was ist Rekursion? 2. Mathe...
Angenommen, ein Knoten im Drei-Knoten-MGR ist abn...
Alibaba Cloud Server kann keine Verbindung zum FT...
Inhaltsverzeichnis 1. Die übergeordnete Komponent...
<br />Die Seite verwendet die UTF8-Kodierung...
Inhaltsverzeichnis 1. Betrieb von js Integer 2. S...
Es gibt eine einfache CSS-Methode, um das Popup-F...
Software-Download Link zum Herunterladen der Soft...
Ich bin vor Kurzem auf ein Problem gestoßen, als ...
1. Die chinesischen verstümmelten Zeichen erschei...