Implementierung des Einfügens von Millionen von Datensätzen in eine MySQL-Datenbank innerhalb von 10 Sekunden

Implementierung des Einfügens von Millionen von Datensätzen in eine MySQL-Datenbank innerhalb von 10 Sekunden

Lassen Sie uns zunächst über eine Frage nachdenken:

Um solch große Datenmengen in die Datenbank einzufügen, muss unter normalen Umständen häufig auf sie zugegriffen werden, und keine maschinelle Ausrüstung kann dies verarbeiten. Wie können wir also häufige Zugriffe auf die Datenbank vermeiden? Können wir einmal darauf zugreifen und sie dann ausführen?

Java hat uns tatsächlich die Antwort gegeben.

Hier kommen zwei Schlüsselobjekte zum Einsatz: Statement und PrepareStatement

Schauen wir uns die Eigenschaften der beiden an:

Zu verwendende BaseDao-Toolklasse (JAR-Paket/Maven-Abhängigkeit) (Maven-Abhängigkeitscode ist am Ende des Artikels angehängt) (für einfache Verwendung gepackt)

Hinweis: (Wichtig) rewriteBatchedStatements=true, fügen Sie mehrere Daten gleichzeitig ein und fügen Sie sie nur einmal ein! !

public class BaseDao { // Statische Tool-Klasse, die zum Erstellen von Datenbankverbindungsobjekten und Freigeben von Ressourcen für einfache Aufrufe verwendet wird // Importieren Sie das JAR-Treiberpaket oder fügen Sie Maven-Abhängigkeiten hinzu (hier wird Maven verwendet und der Maven-Abhängigkeitscode ist am Ende des Artikels angehängt)
    statisch {
        versuchen {
            Klasse.fürName("com.mysql.cj.jdbc.Driver");
        } Fang (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
 
    // Datenbankverbindungsobjekt abrufen public static Connection getConn() {
        Verbindung conn = null;
        versuchen {
            // rewriteBatchedStatements=true, mehrere Daten gleichzeitig einfügen, nur einmal einfügenconn = DriverManager.getConnection("jdbc:mysql://localhost:3306/million-test?rewriteBatchedStatements=true", "root", "qwerdf");
        } Fang (SQLException-Ausnahmen) {
            throwables.printStackTrace();
        }
        Rückverbindung;
    }
 
    // Ressourcen freigeben public static void closeAll(AutoCloseable... autoCloseables) {
        für (AutoCloseable autoCloseable : autoCloseables) {
            wenn (autoCloseable != null) {
                versuchen {
                    autoCloseable.close();
                } Fang (Ausnahme e) {
                    // TODO Automatisch generierter Catch-Block
                    e.printStackTrace();
                }
            }
        }
    }
}

Als nächstes folgen die Schlüsselcodes und Kommentare:

/* Da die Verarbeitungsgeschwindigkeit der Datenbank sehr hoch ist, ist der Einzeldurchsatz sehr groß und die Ausführungseffizienz sehr hoch. addBatch() lädt mehrere SQL-Anweisungen zusammen und sendet sie zur gleichzeitigen Ausführung an die Datenbank. Die Ausführung dauert sehr kurz. preparedStatement.executeUpdate() sendet sie einzeln zur Ausführung an die Datenbank, und die Zeit wird für die Übertragung der Datenbankverbindung verbraucht.*/
öffentliche statische void main(String[] args) {
    long start = System.currentTimeMillis(); // Aktuelle Zeit des Systems abrufen und aufzeichnen, bevor die Methode mit der Ausführung beginnt. Connection conn = BaseDao.getConn(); // Die soeben geschriebene statische Toolklasse aufrufen, um das Datenbankobjekt der Verbindung abzurufen. String sql = "insert into mymilliontest values(null,?,?,?,NOW())"; // Auszuführende SQL-Anweisung PreparedStatement ps = null;
    versuchen {
        ps = conn.prepareStatement(sql); // PreparedStatement-Objekt abrufen // Kontinuierlich SQL generieren
        für (int i = 0; i < 1000000; i++) {
            ps.setString(1, Math.ceil(Math.random() * 1000000) + "");
            ps.setString(2, Math.ceil(Math.random() * 1000000) + "");
            ps.setString(3, UUID.randomUUID().toString()); // Die UUID-Klasse wird verwendet, um zufällig einen String zu generieren, der nicht wiederholt wird. ps.addBatch(); // Fügen Sie dem Batch-Befehl dieses PreparedStatement-Objekts einen Parametersatz hinzu.
        }
        int[] ints = ps.executeBatch(); // Senden Sie einen Stapel von Befehlen zur Ausführung an die Datenbank. Wenn alle Befehle erfolgreich ausgeführt wurden, wird ein Array mit Aktualisierungszahlen zurückgegeben.
        // Wenn die Array-Länge ungleich 0 ist, bedeutet dies, dass die SQL-Anweisung erfolgreich ausgeführt wurde, d. h. eine Million Daten wurden erfolgreich hinzugefügt!
        wenn (ints.length > 0) {
            System.out.println("Eine Million Datensätze wurden erfolgreich hinzugefügt!!");
        }
    } Fang (SQLException-Ausnahmen) {
        throwables.printStackTrace();
    Endlich
        BaseDao.closeAll(conn, ps); // Rufe die gerade geschriebene statische Tool-Klasse auf, um Ressourcen freizugeben}
    long end = System.currentTimeMillis(); // Systemzeit erneut abrufen System.out.println("Benötigte Zeit: " + (end - start) / 1000 + "seconds"); // Die Subtraktion der beiden Zeiten ergibt die zum Ausführen der Methode benötigte Zeit}

Lassen Sie uns abschließend die Ausführung durchführen und die Wirkung betrachten:

Hey, die Dauer hier beträgt mehr als 10 Sekunden, die Ausrüstung ist nicht gut genug, ich hoffe du verstehst ~

<!--mysql-connector-java-Abhängigkeit zur Verbindung mit der Datenbank-->
<Abhängigkeit>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.27</version>
</Abhängigkeit>

PS: Nach dem Hinzufügen von Threads geht es schneller. In den nachfolgenden Artikeln werden Beispiele gegeben.

Dies ist das Ende dieses Artikels darüber, wie man innerhalb von 10 Sekunden eine Million Datensätze in eine MySQL-Datenbank einfügt. Weitere Informationen zum Einfügen einer Million Datensätze in MySQL finden Sie in früheren Artikeln auf 123WORDPRESS.COM oder in den folgenden verwandten Artikeln. Ich hoffe, Sie werden 123WORDPRESS.COM auch in Zukunft unterstützen!

Das könnte Sie auch interessieren:
  • MySQL fügt automatisch Millionen simulierter Datenoperationscodes ein
  • 4 Möglichkeiten zur Optimierung von MySQL-Abfragen für Millionen von Daten
  • Fähigkeiten zur Optimierung der Paginierung der Leistung einer MySQL-Einzeltabelle mit Millionen von Datensätzen
  • So fügen Sie schnell Millionen von Testdaten in MySQL ein

<<:  Einführung in die Benutzerverwaltung unter Linux-Systemen

>>:  So erhalten Sie Formulardaten in Vue

Artikel empfehlen

Detaillierte Erklärung von BOM und DOM in JavaScript

Inhaltsverzeichnis BOM (Browserobjektmodell) 1. F...

Nodejs-Plugin und Nutzungsübersicht

Die Betriebsumgebung dieses Tutorials: Windows 7-...

Installation, Aktivierung und Konfiguration von ModSecurity unter Apache

ModSecurity ist ein leistungsstarkes Paketfiltert...

7 nützliche neue TypeScript-Funktionen

Inhaltsverzeichnis 1. Optionale Verkettung 2. Nul...

Detaillierte Erklärung der Routenkonfiguration von Vue-Router

Inhaltsverzeichnis einführen Objektattribute in R...

Detaillierte Erläuterung des Lesevorgangs für Nginx-Anforderungsheaderdaten

Im vorherigen Artikel haben wir erklärt, wie ngin...

So konfigurieren Sie NAS unter Windows Server 2019

Vorwort Dieses Tutorial installiert die neuste Ve...

So installieren Sie Docker und Portainer in Kali

Mit dem Aufkommen von Docker haben sich viele Die...

Beispielcode zur Implementierung der Schnittstellensignatur mit Vue+Springboot

1. Umsetzungsideen Der Zweck der Schnittstellensi...

Einführung in die Verwendung gängiger XHTML-Tags

Es gibt viele Tags in XHTML, aber nur wenige werd...

So fügen Sie Spalten in einer MySQL-Datenbank hinzu, löschen und ändern sie

Dieser Artikel beschreibt anhand eines Beispiels,...