MySQL大量資料入庫的效能比較
單位IM改版了
使用者聊天內容要存放在資料庫.
一般JAVA Insert MySQL有如下幾種方式
1.自動提交Insert
2.事務提交Insert
3.批次提交
4.使用Load File介面
模擬表結構如下
下面程式碼,分別使用四種方式,Insert 2w記錄.記錄執行時間.
依賴
commons-lang3-3.3.2.jar
mysql-connector-java-5.1.31-bin.jar(低版本驅動有效能影響)
測試結果:
使用者聊天內容要存放在資料庫.
一般JAVA Insert MySQL有如下幾種方式
1.自動提交Insert
2.事務提交Insert
3.批次提交
4.使用Load File介面
模擬表結構如下
-
create table chat_message(
-
id bigint primary key auto_increment,
-
src_userid bigint not null,
-
target_userid bigint not null,
-
message varchar(200),
-
ts timestamp not null default current_timestamp,
-
s1 int,
-
s2 int,
-
s3 int,
-
s4 int
- );
下面程式碼,分別使用四種方式,Insert 2w記錄.記錄執行時間.
依賴
commons-lang3-3.3.2.jar
mysql-connector-java-5.1.31-bin.jar(低版本驅動有效能影響)
- import java.io.ByteArrayInputStream;
- import java.io.InputStream;
- import java.io.UnsupportedEncodingException;
- import java.sql.Connection;
- import java.sql.DriverManager;
- import java.sql.PreparedStatement;
- import java.sql.SQLException;
- import org.apache.commons.lang3.RandomStringUtils;
- public class Main {
- private static String URL = "jdbc:mysql://127.0.0.1:3306/mvbox";
- private static String USERNAME = "xx";
- private static String PWD = "xx";
- private static int MAX = 20000;
- private static String SQL = "insert into chat_message(src_userid,target_userid,message,s1,s2,s3,s4) values(?,?,?,?,?,?,?)";
- public static void main(String[] args) throws ClassNotFoundException, SQLException, UnsupportedEncodingException {
- long start = System.currentTimeMillis();
- testLoadFile(100);
- long end = System.currentTimeMillis();
- System.out.println((end - start));
- System.out.println(MAX / ((end - start) / 1000));
- }
- private static Connection getConnection() throws SQLException, ClassNotFoundException {
- Class.forName("com.mysql.jdbc.Driver");
- Connection con = DriverManager.getConnection(URL, USERNAME, PWD);
- return con;
- }
- private static void testInsert() throws ClassNotFoundException, SQLException {
- Connection con = getConnection();
- con.setAutoCommit(false);
- PreparedStatement pt = con.prepareStatement(SQL);
- int i = 0;
- while (i < MAX) {
- pt.setLong(1, 1 + (int) (Math.random() * 100000000));
- pt.setLong(2, 1 + (int) (Math.random() * 100000000));
- pt.setString(3, RandomStringUtils.randomAscii(200));
- pt.setInt(4, 1);
- pt.setInt(5, 1);
- pt.setInt(6, 1);
- pt.setInt(7, 1);
- pt.executeUpdate();
- con.commit();
- i++;
- }
- con.close();
- }
- private static void testInsertAutoCommit() throws ClassNotFoundException, SQLException {
- Connection con = getConnection();
- con.setAutoCommit(true);
- PreparedStatement pt = con.prepareStatement(SQL);
- int i = 0;
- while (i < MAX) {
- pt.setLong(1, 1 + (int) (Math.random() * 100000000));
- pt.setLong(2, 1 + (int) (Math.random() * 100000000));
- pt.setString(3, RandomStringUtils.randomAscii(200));
- pt.setInt(4, 1);
- pt.setInt(5, 1);
- pt.setInt(6, 1);
- pt.setInt(7, 1);
- pt.executeUpdate();
- i++;
- }
- con.close();
- }
- private static void testBatchInsert(int batchSize) throws ClassNotFoundException, SQLException {
- Connection con = getConnection();
- con.setAutoCommit(false);
- PreparedStatement pt = con.prepareStatement(SQL);
- int i = 0;
- while (i < MAX) {
- pt.setLong(1, 1 + (int) (Math.random() * 100000000));
- pt.setLong(2, 1 + (int) (Math.random() * 100000000));
- pt.setString(3, RandomStringUtils.randomAscii(200));
- pt.setInt(4, 1);
- pt.setInt(5, 1);
- pt.setInt(6, 1);
- pt.setInt(7, 1);
- pt.addBatch();
- if (i % batchSize == 1) {
- pt.executeBatch();
- con.commit();
- }
- i++;
- }
- pt.executeBatch();
- con.commit();
- con.close();
- }
- private static void testLoadFile(int batchSize)
- throws ClassNotFoundException, SQLException, UnsupportedEncodingException {
- String fieldsterminated = "\t\t";
- String linesterminated = "\t\r\n";
- String loadDataSql = "LOAD DATA LOCAL INFILE 'sql.csv' INTO TABLE chat_message FIELDS TERMINATED BY '"
- + fieldsterminated + "' LINES TERMINATED BY '" + linesterminated
- + "' (src_userid,target_userid,message,s1,s2,s3,s4) ";
- Connection con = getConnection();
- con.setAutoCommit(false);
- PreparedStatement pt = con.prepareStatement(loadDataSql);
- com.mysql.jdbc.PreparedStatement mysqlStatement = null;
- if (pt.isWrapperFor(com.mysql.jdbc.Statement.class)) {
- mysqlStatement = pt.unwrap(com.mysql.jdbc.PreparedStatement.class);
- }
- int i = 0;
- StringBuilder sb = new StringBuilder(10000);
- while (i < MAX) {
- sb.append(1 + (int) (Math.random() * 100000000));
- sb.append(fieldsterminated);
- sb.append(1 + (int) (Math.random() * 100000000));
- sb.append(fieldsterminated);
- sb.append(RandomStringUtils.randomAscii(200).replaceAll("\\\\", " "));
- sb.append(fieldsterminated);
- sb.append(1);
- sb.append(fieldsterminated);
- sb.append(1);
- sb.append(fieldsterminated);
- sb.append(1);
- sb.append(fieldsterminated);
- sb.append(1);
- sb.append(linesterminated);
- if (i % batchSize == 1) {
- byte[] bytes = sb.toString().getBytes();
- InputStream in = new ByteArrayInputStream(bytes);
- mysqlStatement.setLocalInfileInputStream(in);
- mysqlStatement.executeUpdate();
- con.commit();
- sb = new StringBuilder(10000);
- }
- i++;
- }
- byte[] bytes = sb.toString().getBytes();
- InputStream in = new ByteArrayInputStream(bytes);
- mysqlStatement.setLocalInfileInputStream(in);
- mysqlStatement.executeUpdate();
- con.commit();
- con.close();
- }
- }
測試結果:
執行方式 | 執行時間(毫秒) | 每秒Insert數量 |
自動提交 |
17437 |
1176 |
事務提交 |
22990 |
909 |
batchInsert 每10條提交 |
12646 |
1666 |
batchInsert 每50條提交 |
13758 |
1538 |
batchInsert 每100條提交 |
15870 |
1333 |
loadfile 每10條提交 |
6973 |
3333 |
loadfile 每50條提交 |
5037 |
4000 |
loadfile 每100條提交 |
4175 |
5000 |
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29254281/viewspace-1841299/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- MySQL大量資料入庫的效能比較(分割槽)MySql
- MySQL大量資料插入各種方法效能分析與比較MySql
- 用PHP連mysql和oracle資料庫效能比較(轉)PHPMySqlOracle資料庫
- Dapper, Ef core, Freesql 插入大量資料效能比較(二)APPSQL
- MySQL 一種比較經濟的資料庫MySql資料庫
- 資料庫系列:MySQL引擎MyISAM和InnoDB的比較資料庫MySql
- mysql資料庫中decimal資料型別比較大小MySql資料庫Decimal資料型別
- 圖資料庫比較資料庫
- 主流資料庫比較資料庫
- HashMap,LinkedHashMap,TreeMap讀取大量資料效率的比較HashMap
- SQL Server資料庫匯入匯出資料方式比較SQLServer資料庫
- DataTable資料批量寫入資料庫三種方法比較資料庫
- java比較mysql兩個資料庫中差異JavaMySql資料庫
- 大資料入門課程:Hadoop和spark的效能比較大資料HadoopSpark
- 大資料量下MySQL插入方法的效能比較大資料MySql
- ORM框架和資料庫對系統效能影響的比較ORM框架資料庫
- XML資料讀取方式效能比較XML
- 百萬行資料查詢效能比較
- 關聯式資料庫比較:SQLite vs MySQL vs PostgreSQL資料庫SQLiteMySql
- oracle資料庫兩表資料比較Oracle資料庫
- MySQL 中的 distinct 和 group by 的效能比較MySql
- 資料庫比較 PostgreSQL vs MongoDB資料庫SQLMongoDB
- 幾種常用資料庫比較資料庫
- 比較兩個資料庫的差異資料庫
- 關閉資料庫比較好的方法資料庫
- 轉享:NoSQL 圖資料庫比較SQL資料庫
- 比較SQL資料庫和HadoopSQL資料庫Hadoop
- Oracle資料庫遷移方案比較Oracle資料庫
- 磁碟資料庫與記憶體資料庫的特點比較資料庫記憶體
- influxdb與傳統資料庫的比較UX資料庫
- 比較有索引和無索引的查詢速度(在mysql資料庫中)索引MySql資料庫
- Mysql pg oracle三種資料庫獲取月份、周的函式比較MySqlOracle資料庫函式
- 【原創】比較資料泵和exp/imp對相同資料匯出/匯入的效能差異
- 常見資料庫系統比較之Oracle資料庫(轉)資料庫Oracle
- oracle Mysql PostgreSQL 資料庫的對比OracleMySql資料庫
- MySQL中MyISAM引擎與InnoDB引擎效能比較MySql
- 區塊鏈與分散式資料庫的比較區塊鏈分散式資料庫
- 常見資料庫SYBASE和SQL SERVER的比較資料庫SQLServer