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

Detailliertes Tutorial zur Installation von ElasticSearch 6.x im Docker

Ziehen Sie zuerst das Image (oder erstellen Sie e...

Tutorial zur Installation von MYSQL8.0 auf Alibaba Cloud ESC

Öffnen Sie das Verbindungstool. Ich verwende Moba...

Drei Möglichkeiten zum Parsen von QR-Codes mit Javascript

Inhaltsverzeichnis 1. Verwenden Sie JavaScript, u...

Verbesserung der Wirkung von Hyperlinks im Webdesign und in der Produktion

Hyperlinks ermöglichen es Benutzern, sofort von ei...

So finden und löschen Sie doppelte Zeilen in MySQL

Inhaltsverzeichnis 1. So finden Sie doppelte Zeil...

JavaScript-Funktion Currying

Inhaltsverzeichnis 1 Was ist Funktions-Currying? ...