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

MySQL-Variablenprinzipien und Anwendungsbeispiele

In der MySQL-Dokumentation können MySQL-Variablen...

So berechnen Sie die Bildrate FPS von Webanimationen

Inhaltsverzeichnis Standards für flüssige Animati...

Die umfassendste package.json-Analyse

Inhaltsverzeichnis 1. Übersicht 2. Namensfeld 3. ...

Sublime Text - Empfohlene Methode zum Festlegen von Browser-Tastenkombinationen

Codeeffekte werden häufig in unterschiedlichen Br...

Die „3I“-Standards für erfolgreiche Printwerbung

Für viele inländische Werbetreibende ist die Erste...

Linux implementiert den Quellcode des Zahlenratespiels

Ein einfacher Linux-Ratespiel-Quellcode Spielrege...

Beispiel für eine automatische Importmethode für das Vue3.0-Routing

1. Voraussetzungen Wir verwenden zum Importieren ...

So machen Sie React-Komponenten im Vollbildmodus

einführen Dieser Artikel basiert auf React + antd...

HTML-Bild img-Tag_Powernode Java Academy

Zusammenfassung Projektbeschreibungsformat < i...

Verwenden von JS zum Implementieren eines einfachen Rechners

Verwenden Sie JS, um einen einfachen Rechner für ...