最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

mysql中批量插入數(shù)據(jù)(1萬、10萬、100萬、1000萬、1億級(jí)別)

 更新時(shí)間:2022年08月15日 09:39:41   作者:回憶灬似水流年  
本文主要介紹了mysql中批量插入數(shù)據(jù)(1萬、10萬、100萬、1000萬、1億級(jí)別),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

硬件:windows7+8G內(nèi)存+i3-4170處理器+4核CPU

首先貼上數(shù)據(jù)庫的操作類BaseDao:

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;
 
import com.lk.entity.TUser;
 
public class BaseDao {
    private static ConfigManager cm = ConfigManager.getInstance();
 
    private static String Driver = null;
    private static String URL = null;
    private static String USER = null;
    private static String PWD = null;
 
    private static Connection conn = null;
    private static PreparedStatement psmt = null;
    public ResultSet rs = null;
    public int row = 0;
 
    static {
        Driver = cm.getString("DRIVER");
        URL = cm.getString("URL");
        USER = cm.getString("USER");
        PWD = cm.getString("PWD");
        try {
            Class.forName(Driver);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        getConnection();
        try {
            conn.setAutoCommit(false);
            psmt = conn.prepareStatement("");
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
 
    private static Connection getConnection() {
        try {
            conn = DriverManager.getConnection(URL, USER, PWD);
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return conn;
    }
 
    /**
     * 多條記錄插入操作
     * flag是為了判斷是否是插入的最后一個(gè)記錄
     */
    public boolean affectRowMore(String sql, List<TUser> list, long flag) {
        try {
            psmt = conn.prepareStatement(sql);
            for (TUser tUser : list) {
                psmt.setLong(1, tUser.getId());
                psmt.setString(2, tUser.getName());
                psmt.setInt(3, tUser.getSex());
                psmt.setString(4, tUser.getPhone());
                psmt.setString(5, tUser.getPassword());
                // 添加執(zhí)行sql
                psmt.addBatch();
            }
            // 執(zhí)行操作
            int[] counts = psmt.executeBatch(); // 執(zhí)行Batch中的全部語句
            conn.commit(); // 提交到數(shù)據(jù)庫
            for (int i : counts) {
                if (i == 0) {
                    conn.rollback();
                }
            }
            closeAll(flag);
        } catch (SQLException e) {
            e.printStackTrace();
            return false;
        }
        return true;
    }
 
    /**
     * 多條記錄插入操作
     */
    public boolean affectRowMore1(String sql, long flag) {
        try {
            psmt.addBatch(sql);
            // 執(zhí)行操作
            int[] counts = psmt.executeBatch(); // 執(zhí)行Batch中的全部語句
            conn.commit(); // 提交到數(shù)據(jù)庫
            for (int i : counts) {
                if (i == 0) {
                    conn.rollback();
                    return false;
                }
            }
            closeAll(flag);
        } catch (SQLException e) {
            e.printStackTrace();
            return false;
        }
        return true;
    }
 
    public void closeAll(long flag) {
        try {
            if (conn != null && flag == -1) {
                // 在完成批量操作后恢復(fù)默認(rèn)的自動(dòng)提交方式,提高程序的可擴(kuò)展性
                conn.setAutoCommit(true);
                conn.close();
            }
            if (psmt != null && flag == -1) {
                psmt.close();
            }
            if (rs != null) {
                rs.close();
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

方法一:

通過BaseDao中的affectRowMore方法進(jìn)行插入,插入的速度如下所示:

     * 一萬條數(shù)據(jù)(通過多條添加)
     * 生成1萬條數(shù)據(jù)共花費(fèi)978毫秒
     * 生成10萬條數(shù)據(jù)共花費(fèi)5826毫秒
     * 生成100萬條數(shù)據(jù)共花費(fèi)54929毫秒
     * 生成1000萬條數(shù)據(jù)共花費(fèi)548640毫秒
     * 生成1億條數(shù)據(jù)(因?yàn)閿?shù)字過大,沒有計(jì)算)

public void insertBenchMark() {
?? ??? ?long start = System.currentTimeMillis();
?? ??? ?List<TUser> list = new ArrayList<>();
?? ??? ?long row = 1;
?? ??? ?for (int j = 0; j < 1000; j++) {
?? ??? ??? ?for (int i = 0; i < 10000; i++) {
?? ??? ??? ??? ?String uuid = UUID.randomUUID().toString();
?? ??? ??? ??? ?String name = uuid.substring(0, 4);
?? ??? ??? ??? ?int sex = -1;
?? ??? ??? ??? ?if(Math.random() < 0.51) {
?? ??? ??? ??? ??? ?sex = 1;
?? ??? ??? ??? ?}else {
?? ??? ??? ??? ??? ?sex = 0;
?? ??? ??? ??? ?}
?? ??? ??? ??? ?String phone = (String) RandomValue.getAddress().get("tel");
?? ??? ??? ??? ?list.add(new TUser(row,name, sex, phone, uuid));
?? ??? ??? ??? ?row++;
?? ??? ??? ?}
?? ??? ??? ?int flag = 1;
?? ??? ??? ?if(j==999) {
?? ??? ??? ??? ?flag = -1;
?? ??? ??? ?}
?? ??? ??? ?//封裝好的
?? ??? ??? ?boolean b = userDao.insertMore(list,flag);
?? ??? ??? ?if(!b) {
?? ??? ??? ??? ?System.out.println("出錯(cuò)了----");
?? ??? ??? ??? ?System.exit(0);
?? ??? ??? ?}else {
?? ??? ??? ??? ?list.clear();
?? ??? ??? ?}
?? ??? ?}
?? ??? ?long end = System.currentTimeMillis();
?? ??? ?System.out.println("生成1000萬條數(shù)據(jù)共花費(fèi)"+(end-start)+"毫秒");
?? ?}

public boolean insertMore(List<TUser> list,long flag) {
?? ??? ?String sql = "insert into tuser(id,name,sex,phone,password) values(?,?,?,?,?)";
?? ??? ?return affectRowMore(sql,list,flag);
?? ?}

方法二:

通過BaseDao中的affectRowMore1方法進(jìn)行數(shù)據(jù)的插入操作,插入的速度如下:

     * 通過拼接語句實(shí)現(xiàn)多條添加
     * 生成1萬條數(shù)據(jù)共花費(fèi)225毫秒
     * 生成10萬條數(shù)據(jù)共花費(fèi)1586毫秒
     * 生成100萬條數(shù)據(jù)共花費(fèi)14017毫秒
     * 生成1000萬條數(shù)據(jù)共花費(fèi)152127毫秒
     * 生成1億條數(shù)據(jù)(因?yàn)閿?shù)字過大,沒有計(jì)算)

public void insertBenchMark1() {
?? ??? ?long start = System.currentTimeMillis();
?? ??? ?StringBuffer suffix = new StringBuffer();
?? ??? ?long row = 1;
?? ??? ?for (int j = 0; j < 1000; j++) {
?? ??? ??? ?for (int i = 0; i < 10000; i++) {
?? ??? ??? ??? ?String uuid = UUID.randomUUID().toString();
?? ??? ??? ??? ?String name = uuid.substring(0, 4);
?? ??? ??? ??? ?int sex = -1;
?? ??? ??? ??? ?if(Math.random() < 0.51) {
?? ??? ??? ??? ??? ?sex = 1;
?? ??? ??? ??? ?}else {
?? ??? ??? ??? ??? ?sex = 0;
?? ??? ??? ??? ?}
?? ??? ??? ??? ?String phone = (String) RandomValue.getAddress().get("tel");
?? ??? ??? ??? ?suffix.append("(" + row + ",'" + name + "'," + sex + ",'" + phone + "','" + uuid + "'),");
?? ??? ??? ??? ?row++;
?? ??? ??? ?}
?? ??? ??? ?boolean b = userDao.insertMore1(suffix.substring(0, suffix.length()-1),j);
?? ??? ??? ?if(!b) {
?? ??? ??? ??? ?System.out.println("出錯(cuò)了----");
?? ??? ??? ??? ?System.exit(0);
?? ??? ??? ?}else {
?? ??? ??? ??? ?// 清空上一次添加的數(shù)據(jù)
?? ??? ??? ??? ?suffix = new StringBuffer();
?? ??? ??? ?}
?? ??? ?}
?? ??? ?long end = System.currentTimeMillis();
?? ??? ?System.out.println("生成1000萬條數(shù)據(jù)共花費(fèi)"+(end-start)+"毫秒");
?? ?}

public boolean insertMore1(String sql_suffix,long flag) {
?? ??? ?String sql_prefix = "insert into tuser(id,name,sex,phone,password) values ";
?? ??? ?return affectRowMore1(sql_prefix + sql_suffix,flag);
?? ?}

總結(jié):

方法一和方法二很類同,唯一不同的是方法一采用的是“insert into tb (...) values (...);insert into tb (...) values (...);...”的方式執(zhí)行插入操作,方法二則是“insert into tb (...) values(...),(...)...;”的方式。

通過測(cè)試的對(duì)比,方法二比方法一快了近5倍。

到此這篇關(guān)于mysql中批量插入數(shù)據(jù)(1萬、10萬、100萬、1000萬、1億級(jí)別)的文章就介紹到這了,更多相關(guān)mysql 批量插入數(shù)據(jù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • MySQL8設(shè)置自動(dòng)創(chuàng)建時(shí)間和自動(dòng)更新時(shí)間的實(shí)現(xiàn)方法

    MySQL8設(shè)置自動(dòng)創(chuàng)建時(shí)間和自動(dòng)更新時(shí)間的實(shí)現(xiàn)方法

    在實(shí)際應(yīng)用中,我們時(shí)常會(huì)需要用到創(chuàng)建時(shí)間和更新時(shí)間這兩個(gè)字段,下面這篇文章主要給大家介紹了關(guān)于MySQL8設(shè)置自動(dòng)創(chuàng)建時(shí)間和自動(dòng)更新時(shí)間的實(shí)現(xiàn)方法,需要的朋友可以參考下
    2023-03-03
  • MySQL數(shù)據(jù)庫表的合并及分區(qū)方式

    MySQL數(shù)據(jù)庫表的合并及分區(qū)方式

    這篇文章主要介紹了MySQL數(shù)據(jù)庫表的合并及分區(qū)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • MySQL Memory 存儲(chǔ)引擎淺析

    MySQL Memory 存儲(chǔ)引擎淺析

    需求源自項(xiàng)目中的MemCache需求,開始想用MemCached(官方站點(diǎn):http://memcached.org/ ),但這個(gè)在Linux下面應(yīng)用廣泛的開源軟件無官方支持的Windows版本
    2011-12-12
  • 理解MySQL查詢優(yōu)化處理過程

    理解MySQL查詢優(yōu)化處理過程

    MySQL查詢優(yōu)化需要經(jīng)過解析、預(yù)處理和優(yōu)化三個(gè)步驟。在這些過程中,都有可能發(fā)生錯(cuò)誤。本篇文章不會(huì)深入討論錯(cuò)誤處理,而是幫助理解 MySQL 執(zhí)行查詢的方式,以便可以寫出更好的查詢語句。
    2021-05-05
  • MySQL實(shí)現(xiàn)樹狀所有子節(jié)點(diǎn)查詢的方法

    MySQL實(shí)現(xiàn)樹狀所有子節(jié)點(diǎn)查詢的方法

    這篇文章主要介紹了MySQL實(shí)現(xiàn)樹狀所有子節(jié)點(diǎn)查詢的方法,涉及mysql節(jié)點(diǎn)查詢、存儲(chǔ)過程調(diào)用等操作技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2016-06-06
  • 用MySQL函數(shù)清除字符串首尾空白字符的方法

    用MySQL函數(shù)清除字符串首尾空白字符的方法

    由于內(nèi)容插入的時(shí)候沒辦法進(jìn)行完全的過濾,所以審核這里就經(jīng)常出問題,搞的頭大,而MySQL的trim函數(shù)沒辦法去掉回車和換行,只能去掉多余的空格
    2011-03-03
  • MySQL存儲(chǔ)路徑遷移的詳細(xì)步驟

    MySQL存儲(chǔ)路徑遷移的詳細(xì)步驟

    在構(gòu)建Web應(yīng)用程序時(shí),MySQL是存儲(chǔ)數(shù)據(jù)的核心工具,在云服務(wù)器上,正確設(shè)置MySQL的存儲(chǔ)路徑對(duì)應(yīng)用性能至關(guān)重要,通過遷移,我們不僅解決了空間不足的問題,還能讓數(shù)據(jù)庫運(yùn)行得更快,所以本文將給大家介紹MySQL存儲(chǔ)路徑遷移的詳細(xì)步驟,需要的朋友可以參考下
    2024-06-06
  • 深入理解MySQL中MVCC與BufferPool緩存機(jī)制

    深入理解MySQL中MVCC與BufferPool緩存機(jī)制

    這篇文章主要介紹了深入理解MySQL中MVCC與BufferPool緩存機(jī)制,MySQL默認(rèn)RR隔離級(jí)別就是通過該機(jī)制來保證的MVCC,更多主題相關(guān)內(nèi)容,需要的可以參考下面文章內(nèi)容介紹
    2022-05-05
  • MySQ登錄提示ERROR 1045 (28000)錯(cuò)誤的解決方法

    MySQ登錄提示ERROR 1045 (28000)錯(cuò)誤的解決方法

    這篇文章主要為大家詳細(xì)介紹了MySQ登錄提示ERROR 1045 (28000)錯(cuò)誤的解決方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-07-07
  • Mysql 日期時(shí)間 DATE_FORMAT(date,format)

    Mysql 日期時(shí)間 DATE_FORMAT(date,format)

    Mysql 日期時(shí)間 DATE_FORMAT(date,format) ,需要的朋友可以參考下。
    2010-12-12

最新評(píng)論

灌云县| 宿迁市| 仙游县| 冷水江市| 开平市| 赣州市| 顺平县| 孟津县| 陆良县| 伊吾县| 夏河县| 通化市| 岳西县| 讷河市| 巴塘县| 石屏县| 马龙县| 寻乌县| 桦川县| 巨鹿县| 苍梧县| 桐乡市| 寻甸| 隆化县| 巴里| 缙云县| 石狮市| 花莲县| 吉水县| 东乡族自治县| 涿鹿县| 章丘市| 忻城县| 连云港市| 观塘区| 缙云县| 贞丰县| 抚松县| 宿州市| 滁州市| 金湖县|