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

Lösung für die Baidu-Site-Suche, die https nicht unterstützt (getestet)

Seit kurzem ist https auch auf dem Handy möglich....

Detaillierte Erklärung des Prinzips und der Funktion des JavaScript-Closures

Inhaltsverzeichnis Einführung Verwendung von Vers...

Natives JS zum Erzielen eines Schiebeknopfeffekts

Der spezifische Code des mit Js erstellten Schieb...

Toolkit: Ein leistungsfähigeres Front-End-Framework als Bootstrap

Hinweis: Die derzeit beliebtesten Front-End-Frame...

So implementieren Sie die Fernzugriffskontrolle in Centos 7.4

1. SSH-Remoteverwaltung SSH ist ein sicheres Kana...

Die beste Erklärung zu HTTPS

Guten Morgen allerseits, ich habe meinen Artikel ...

CentOS8-Installationstutorial für JDK8/Java8 (empfohlen)

Vorwort Zuerst wollte ich es mit wget auf CentOS8...

Zwei Beispiele für die Verwendung von Symbolen in Vue3

Inhaltsverzeichnis 1. Verwenden Sie SVG 2. Verwen...

Allgemeine Verwendung von regulären Ausdrücken in MySQL

Allgemeine Verwendung von Regexp in Mysql Fuzzy-M...

Zusammenfassung der Fallstricke bei Virtualbox Centos7 NAT+Host-Only-Netzwerken

Inhaltsverzeichnis 1. Problemhintergrund 2. Welch...

Ein Artikel zeigt Ihnen, wie Sie mit React ein Rezeptsystem implementieren

Inhaltsverzeichnis 1. Rezeptsammlung 1.1 Projekth...

So lösen Sie das Problem verschwommener kleiner Symbole auf Mobilgeräten

Vorwort Zuvor habe ich über das Problem der verti...