Verwenden von Streaming-Abfragen in MySQL, um Daten-OOM zu vermeiden

Verwenden von Streaming-Abfragen in MySQL, um Daten-OOM zu vermeiden

1. Einleitung

Wenn ein Programm auf eine MySQL Datenbank zugreift und die abgefragte Datenmenge besonders groß ist, lädt der Datenbanktreiber alle geladenen Daten in den Speicher, was zu einem Speicherüberlauf (OOM) führen kann.

Tatsächlich bietet MySQL Datenbank Streaming-Abfragen, mit denen qualifizierte Daten stapelweise in den Speicher geladen werden können, wodurch OOM effektiv vermieden werden kann. Dieser Artikel stellt hauptsächlich die Verwendung von Streaming-Abfragen vor und vergleicht sie mit normalen Abfragen zum Testen der Leistung.

2. JDBC implementiert Streaming-Abfragen

Streaming-Abfragen können implementiert werden, indem die Methode setFetchSize von PreparedStatement/Statement von JDBC auf Integer.MIN_VALUE gesetzt oder die Methode Statement.enableStreamingResults() verwendet wird. Wenn ResultSet.next() ausgeführt wird, wird sie nacheinander über die Datenbankverbindung zurückgegeben, wodurch nicht viel Clientspeicher belegt wird.

öffentliche int ausführen(String sql, boolean isStreamQuery) wirft SQLException {
 Verbindung conn = null;
 Vorbereitete Anweisung stmt = null;
 Ergebnismenge rs = null;
 int-Anzahl = 0;
 versuchen {
  //Datenbankverbindung abrufen conn = getConnection();
  wenn (istStreamQuery) {
   //Streaming-Abfrageparameter festlegen stmt = conn.prepareStatement(sql, ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY);
   stmt.setFetchSize(Integer.MIN_VALUE);
  } anders {
   //Normale Abfrage stmt = conn.prepareStatement(sql);
  }

  //Führen Sie die Abfrage aus, um das Ergebnis zu erhalten rs = stmt.executeQuery();
  //Durchlaufe die Ergebnisse, während (rs.next ()) {
   System.out.println(rs.getString(1));
   zählen++;
  }
 } Fang (SQLException e) {
  e.printStackTrace();
 Endlich
  schließen(stmt, rs, conn);
 }
 Anzahl zurückgeben;
}

"PS": Im obigen Beispiel wird der Parameter isStreamQuery verwendet, um für den folgenden Testvergleich zwischen "Streaming-Abfrage" und "normaler Abfrage" umzuschalten.

3. Leistungstest

Zum Testen wird eine Testtabelle my_test angelegt. Die Gesamtdatenmenge beträgt 27w . Zum Testen werden folgende vier Testfälle verwendet:

  • Allgemeine Abfrage mit großem Datenvolumen (270.000 Elemente)
  • Streaming-Abfrage mit großem Datenvolumen (270.000 Datensätze)
  • Kleine Datenmenge, allgemeine Abfrage (10 Elemente)
  • Streaming-Abfrage für kleine Datenmengen (10 Elemente)

3.1. Allgemeine Abfragen mit großem Datenvolumen testen

@Prüfen
öffentliche void testCommonBigData() wirft SQLException {
 Zeichenfolge SQL = "Wählen Sie * aus my_test aus";
 testExecute(sql, false);
}

3.1.1. Abfragezeit

27W Datenvolumen dauert 38 Sekunden

3.1.2. Speichernutzung

Verwendet fast 1 GB Speicher

3.2. Testen von Streaming-Abfragen mit großem Datenvolumen

@Prüfen
öffentliche void testStreamBigData() wirft SQLException {
 Zeichenfolge SQL = "Wählen Sie * aus my_test aus";
 testExecute(sql, true);
}

3.2.1. Abfragezeit

27W Datenvolumen dauert 37 Sekunden

3.2.2. Speichernutzung

Da es in Chargen erworben wird, schwankt der Speicher zwischen 30-270m

3.3. Testen Sie normale Abfragen mit kleinem Datenvolumen

@Prüfen
öffentliche void testCommonSmallData() wirft SQLException {
 Zeichenfolge SQL = "Wählen Sie * aus my_test-Limit 100000, 10";
 testExecute(sql, false);
}

3.3.1. Abfragezeit

10 Daten dauern 1 Sekunde

3.4. Streaming-Abfrage mit kleiner Datenmenge testen

@Prüfen
public void testStreamSmallData() wirft SQLException {
 Zeichenfolge SQL = "Wählen Sie * aus my_test-Limit 100000, 10";
 testExecute(sql, true);
}

3.4.1. Abfragezeit

10 Daten dauern 1 Sekunde

IV. Fazit

MySQL-Streaming-Abfragen haben offensichtliche Optimierungseffekte auf die Speichernutzung, haben jedoch nur geringe Auswirkungen auf die Abfragegeschwindigkeit. Sie werden hauptsächlich verwendet, um das Szenario hoher Speichernutzung bei der Abfrage großer Datenmengen zu lösen.

„DEMO-Adresse“: https://github.com/zlt2000/mysql-stream-query

Dies ist das Ende dieses Artikels über die Verwendung von Streaming-Abfragen in MySQL zur Vermeidung von Daten-OOM. Weitere relevante Inhalte zu MySQL-Streaming-Abfragen finden Sie in früheren Artikeln auf 123WORDPRESS.COM oder in den folgenden verwandten Artikeln. Ich hoffe, dass jeder 123WORDPRESS.COM in Zukunft unterstützen wird!

Das könnte Sie auch interessieren:
  • Lösungen für MySQL OOM (Speicherüberlauf)
  • Lösung für MySQL Slave, der Oom-Killer auslöst
  • MySQL OOM-Serie 3: Befreien Sie sich vom Pech, dass MySQL abgeschafft wurde
  • MySQL OOM System 2 OOM-Killer
  • MySQL OOM Serie 1 Linux-Speicherzuweisung

<<:  Eine einfache Möglichkeit zum Erstellen einer Docker-Umgebung

>>:  Natives JS zur Implementierung der E-Mail-Eingabeaufforderung im Anmeldefeld

Artikel empfehlen

So implementieren Sie eine automatische Remote-Sicherung von MongoDB unter Linux

Vorwort Nachdem ich den vorherigen Artikel über d...

So migrieren Sie MySQL-Daten richtig nach Oracle

In der MySQL-Datenbank gibt es eine Tabelle Stude...

Analyse des Parameterübertragungsprozesses des Treibermoduls in Linux

Deklarieren Sie den Parameternamen, den Typ und d...

Einführung in TypeScript-Schnittstellen

Inhaltsverzeichnis 1. Schnittstellendefinition 2....

jQuery implementiert eine einfache Änderung der Schaltflächenfarbe

Wir möchten in HTML und CSS die Farbe eines Butto...

Detaillierte Erklärung der Verwendung von Bildschirmbefehlen in Linux

GUN-Bildschirm: Offizielle Website: http://www.gn...

Detaillierte Erklärung der wichtigsten Einzigartigkeit von v-for in Vue

Inhaltsverzeichnis 1. DOM-Diff 2. Fügen Sie Eleme...

JavaScript implementiert das Klassenlotterie-Applet

In diesem Artikel wird der spezifische JavaScript...

Konfigurieren Sie die Java-Entwicklungsumgebung in Ubuntu 20.04 LTS

Laden Sie das Java Development Kit jdk herunter D...

Beispielerklärung für Ausführungskontext und Ausführungsstapel in JavaScript

JavaScript - Prinzipienreihe Wenn wir in der tägl...

CSS3 realisiert die Mask Barrage-Funktion

Kürzlich habe ich auf der B-Station einen Sperrfe...