我用到的數據庫為,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代碼如下:
package com.mysql;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.Date;
public class InsertTest {
public static void main(String[] args) throws ClassNotFoundException, SQLException {
final String url = "jdbc:mysql://127.0.0.1/test?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC";
final String name = "com.mysql.jdbc.Driver";
final String user = "root";
final String password = "root";
Connection conn = null;
Class.forName(name);//指定連接類型
conn = DriverManager.getConnection(url, user, password);//獲取連接
if (conn != null) {
System.out.println("獲取連接成功");
insert(conn);
} else {
System.out.println("獲取連接失敗");
}
}
public static void insert(Connection conn) {
// 開始時間
Long begin = new Date().getTime();
// sql前綴
String prefix = "INSERT INTO t_teacher (name, age) VALUES ";
try {
// 保存sql后綴
StringBuffer suffix = new StringBuffer();
// 設置事務為非自動提交
conn.setAutoCommit(false);
// 比起st,pst會更好些
PreparedStatement pst = (PreparedStatement) conn.prepareStatement(" ");//准備執行語句
// 外層循環,總提交事務次數
for (int i = 1; i <= 100; i++) {
suffix = new StringBuffer();
// 第j次提交步長
for (int j = 1; j <= 100000; j++) {
// 構建SQL后綴
suffix.append("('" + "cxx" + j + "'," + j + "),");
}
// 構建完整SQL
String sql = prefix + suffix.substring(0, suffix.length() - 1);
// 添加執行SQL
pst.addBatch(sql);
// 執行操作
pst.executeBatch();
// 提交事務
conn.commit();
// 清空上一次添加的數據
suffix = new StringBuffer();
}
// 頭等連接
pst.close();
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
// 結束時間
Long end = new Date().getTime();
// 耗時
System.out.println("1000萬條數據插入花費時間 : " + (end - begin) / 1000 + " s");
System.out.println("插入完成");
}
}
結果:

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

用了77秒,比MyISAW慢了3倍左右,估計要是1000萬條數據的時候更慢吧。。。