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

MySQL Serie 3 Grundlagen

Inhaltsverzeichnis Tutorial-Reihe 1. Einführung i...

Eclipse konfiguriert Tomcat und Tomcat hat eine ungültige Port-Lösung

Inhaltsverzeichnis 1. Eclipse konfiguriert Tomcat...

So löschen Sie eine MySQL-Tabelle

Das Löschen einer Tabelle in MySQL ist sehr einfa...

Lösen Sie das Problem verstümmelter chinesischer Schriftzeichen in Mysql5.7

Wenn Sie MySQL 5.7 verwenden, werden Sie feststel...

So erstellen Sie eine PHP+Nginx+Swoole+MySQL+Redis-Umgebung mit Docker

Betriebssystem: Alibaba Cloud ESC-Instanz centos7...

Fallstricke basierend auf MySQL-Standardsortierregeln

Der Standardtyp varchar in MySQL ist case-insensi...

Mit CSS3 implementierte Schaltfläche zum Hovern von Bildern

Ergebnis:Implementierungscode html <ul Klasse=...