编程知识 cdmana.com

5 minutes pour insérer 10 millions de données dans la base de données MySQL

La base de données que j'utilise est,mysqlBase de données5.7Version

1.Préparez d'abord vos propres tables de base de données

En fait, j'insère1000J'ai eu des problèmes avec les 10 000 données,Maintenant, résolvez - les d'abord,Au début, j'ai inséré100Une erreur de 10 000 données,Les informations de la console sont les suivantes:

com.mysql.jdbc.PacketTooBigException: Packet for query is too large (4232009 > 4194304). You can change this value on the server by setting the max_allowed_packet’ variable.

L'erreur ci - dessus s'est produite parce que la table de base de données max_allowed_packetCette configuration n'est pas assez grande,Parce que la valeur par défaut est4MDe,Plus tard, j'ai été100MIl n'y a pas d'erreur.

set global max_allowed_packet = 100*1024*1024*
N'oublie pas,La valeur après le réglage que vous ne pouvez pas voir tant que vous n'êtes pas connecté à la base de données après le réglage
show VARIABLES like '%max_allowed_packet%'
JavaDejdbcLes codes sont les suivants::

Copier le Code
 1 package com.mysql;
 2 
 3 import java.sql.Connection;
 4 import java.sql.DriverManager;
 5 import java.sql.PreparedStatement;
 6 import java.sql.SQLException;
 7 import java.util.Date;
 8 
 9 public class InsertTest {
10 
11     public static void main(String[] args) throws ClassNotFoundException, SQLException {
12         final String url = "jdbc:mysql://127.0.0.1/test?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC";
13         final String name = "com.mysql.jdbc.Driver";
14         final String user = "root";
15         final String password = "root";
16         Connection conn = null;
17         Class.forName(name);// Spécifiez le type de connexion 
18         conn = DriverManager.getConnection(url, user, password);//Obtenir la connexion
19         if (conn != null) {
20             System.out.println(" Connexion obtenue avec succès ");
21             insert(conn);
22         } else {
23             System.out.println(" Impossible d'obtenir la connexion ");
24         }
25 
26     }
27 
28     public static void insert(Connection conn) {
29         // Heure de début
30         Long begin = new Date().getTime();
31         // sqlPréfixe
32         String prefix = "INSERT INTO t_teacher (name, age) VALUES ";
33         try {
34             // EnregistrersqlSuffixe
35             StringBuffer suffix = new StringBuffer();
36             //  Définir la transaction pour ne pas engager automatiquement 
37             conn.setAutoCommit(false);
38             // Par rapport àst,pst Ce serait mieux 
39             PreparedStatement pst = (PreparedStatement) conn.prepareStatement(" ");// Préparez - vous à exécuter l'instruction 
40             // Cycle externe, Nombre total de transactions engagées 
41             for (int i = 1; i <= 100; i++) {
42                 suffix = new StringBuffer();
43                 // Noj Nombre d'étapes de soumission 
44                 for (int j = 1; j <= 100000; j++) {
45                     // ConstruireSQLSuffixe
46                     suffix.append("('" + "cxx" + j + "'," + j + "),");
47                 }
48                 // Construction complèteSQL
49                 String sql = prefix + suffix.substring(0, suffix.length() - 1);
50                 //  Ajouter l'exécution SQL
51                 pst.addBatch(sql);
52                 // Exécution des opérations
53                 pst.executeBatch();
54                 // Soumettre une transaction
55                 conn.commit();
56                 //  Effacer les dernières données ajoutées 
57                 suffix = new StringBuffer();
58             }
59             //  Connexion de première classe 
60             pst.close();
61             conn.close();
62         } catch (SQLException e) {
63             e.printStackTrace();
64         }
65         // Fin de l'heure
66         Long end = new Date().getTime();
67         // Ça prend du temps
68         System.out.println("1000 L'insertion de 10 000 données prend du temps  : " + (end - begin) / 1000 + " s");
69         System.out.println(" Insertion terminée ");
70     }
71 }
Copier le Code

 


  Résultats:
 

Ha Ha!,100010 000 données288Seconde terminée., Est - ce que ça fait super Bull , Chaque fois que j'insère 10 Dix mille données pour une transaction , Si c'est mauvais, ça devrait prendre des heures , Quelqu'un en ligne a essayé de perdre du temps à se connecter à la base de données ,
Plus tard, je veux tester l'insertion 100 La différence entre les moteurs de base de données à 10 000 données
Commencez par la boucle la plus externe du Code i=100Lire comme suit:i=10;
1. Le moteur de base de données est MyISAMHeure:27s, J'ai oublié la capture d'écran . Parce que je l'ai testé plus tard InnoDB Quand j'ai changé de table pour tester , Parce que je ne peux pas changer le moteur de la table de base de données .... Donc vous ne pouvez changer qu'une seule table pour tester
1. Le moteur de base de données est InnoDBHeure:

 Ça marche.77Secondes,QueMyISAWÇa ralentit.3Environ deux fois, Je suppose que si 1000 C'est encore plus lent avec 10 000 données ...

版权声明
本文为[Pas paresseux.]所创,转载请带上原文链接,感谢
https://cdmana.com/2021/09/20210915080020350k.html

Scroll to Top