五分鐘向MySql數據庫插入一千萬條數據

我用到的數據庫爲,mysql數據庫5.7版本的

1.首先自己準備好數據庫表

其實我在插入1000萬條數據的時候遇到了一些問題,現在先來解決他們,一開始我插入100萬條數據時候報錯,控制檯的信息如下:

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.

出現上面的錯誤是因爲數據庫表的 max_allowed_packet這個配置沒配置足夠大,因爲默認的爲4M的,後來我調爲100M就沒報錯了

set global max_allowed_packet = 100*1024*1024*
記住,設置好後重新登錄數據庫才能看的設置後的值
show VARIABLES like '%max_allowed_packet%'
Java的jdbc代碼如下:

複製代碼
 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);//指定連接類型
18         conn = DriverManager.getConnection(url, user, password);//獲取連接
19         if (conn != null) {
20             System.out.println("獲取連接成功");
21             insert(conn);
22         } else {
23             System.out.println("獲取連接失敗");
24         }
25 
26     }
27 
28     public static void insert(Connection conn) {
29         // 開始時間
30         Long begin = new Date().getTime();
31         // sql前綴
32         String prefix = "INSERT INTO t_teacher (name, age) VALUES ";
33         try {
34             // 保存sql後綴
35             StringBuffer suffix = new StringBuffer();
36             // 設置事務爲非自動提交
37             conn.setAutoCommit(false);
38             // 比起st,pst會更好些
39             PreparedStatement pst = (PreparedStatement) conn.prepareStatement(" ");//準備執行語句
40             // 外層循環,總提交事務次數
41             for (int i = 1; i <= 100; i++) {
42                 suffix = new StringBuffer();
43                 // 第j次提交步長
44                 for (int j = 1; j <= 100000; j++) {
45                     // 構建SQL後綴
46                     suffix.append("('" + "cxx" + j + "'," + j + "),");
47                 }
48                 // 構建完整SQL
49                 String sql = prefix + suffix.substring(0, suffix.length() - 1);
50                 // 添加執行SQL
51                 pst.addBatch(sql);
52                 // 執行操作
53                 pst.executeBatch();
54                 // 提交事務
55                 conn.commit();
56                 // 清空上一次添加的數據
57                 suffix = new StringBuffer();
58             }
59             // 頭等連接
60             pst.close();
61             conn.close();
62         } catch (SQLException e) {
63             e.printStackTrace();
64         }
65         // 結束時間
66         Long end = new Date().getTime();
67         // 耗時
68         System.out.println("1000萬條數據插入花費時間 : " + (end - begin) / 1000 + " s");
69         System.out.println("插入完成");
70     }
71 }
複製代碼

 


  結果:
 

哈哈,1000萬條數據288秒完成,是不是感覺超級牛逼,我每次插入10萬條數據就提交一次事務,如果是一條一條差的話估計要好幾個小時,網上有人試過時間浪費在數據庫的連接上了,
後來我想測試插入100萬條數據時候數據庫引擎的差別
首先把代碼中最外層的循環i=100改爲i=10;
1.數據庫引擎爲MyISAM時:27s,這個我忘了截圖了。因爲我後來測試InnoDB的時候我換了一個表來測試,因爲我發現改不了數據庫表的引擎。。。。所以只能換一個表來測試
1.數據庫引擎爲InnoDB時:

 用了77秒,比MyISAW慢了3倍左右,估計要是1000萬條數據的時候更慢吧。。。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章