欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

分析Mysql大量數(shù)據(jù)導(dǎo)入遇到的問題以及解決方案

 更新時(shí)間:2018年02月02日 11:11:14   作者:cooldream2009  
這篇文章主要介紹了Mysql大量數(shù)據(jù)導(dǎo)入遇到的問題以及解決方案,希望我們整理的內(nèi)容能夠幫助到大家。

在項(xiàng)目中,經(jīng)常會(huì)碰到往數(shù)據(jù)庫(kù)中導(dǎo)入大量數(shù)據(jù),以便利用sql進(jìn)行數(shù)據(jù)分析。在導(dǎo)入數(shù)據(jù)的過程中會(huì)碰到一些需要解決的問題,這里結(jié)合導(dǎo)入一個(gè)大約4G的txt數(shù)據(jù)的實(shí)踐,把碰到的問題以及解決方法展現(xiàn)出來(lái),一方面自己做個(gè)總結(jié)記錄,另一方面希望對(duì)那些碰到相同問題的朋友有個(gè)參考。

我導(dǎo)入的數(shù)據(jù)是百科的txt文件,文件大小有4G多,數(shù)據(jù)有6500萬(wàn)余條,每條數(shù)據(jù)通過換行符分隔。每條數(shù)據(jù)包含三個(gè)字段,字段之間通過Tab分隔。將數(shù)據(jù)取出來(lái)的方法我采用的是用一個(gè)TripleData類來(lái)存放這三個(gè)字段,字段都用String,然后將多條數(shù)據(jù)存到List<TripleData>中,再將List<TripleData>存入mysql數(shù)據(jù)庫(kù),分批將所有數(shù)據(jù)存到mysql數(shù)據(jù)庫(kù)中。

以上是一個(gè)大概的思路,下面是具體導(dǎo)入過程中碰到的問題。

1 數(shù)據(jù)庫(kù)連接的亂碼及兼容問題。

數(shù)據(jù)中如果有中文的話,一定要把鏈接數(shù)據(jù)庫(kù)的url設(shè)置編碼的參數(shù),url設(shè)置為如下的形式。

URL="jdbc:mysql://"+IP+":"+PORT+"/"+DB_NAME+"?useSSL=false&useUnicode=true&characterEncoding=utf-8";

把編碼設(shè)置為UTF-8是解決亂碼問題,設(shè)置useSSL是解決JDBC與mysql的兼容問題。如果不設(shè)置useSSL,會(huì)報(bào)錯(cuò)。類似于

Establishing SSL connection without server's identity verification is not recommended. According to MySQL 5.5.45+, 5.6.26+ and 5.7.6+ requirements SSL connection must be established by default if explicit option isn't set. For compliance with existing applications not using SSL the verifyServerCertificate property is set to 'false'. You need either to explicitly disable SSL by setting useSSL=false, or set useSSL=true and provide truststore for server certificate verification.

這樣的錯(cuò)誤信息。主要是mysql版本比較高,JDBC版本比較低,需要兼容。

2 utf8mb4編碼問題

在導(dǎo)入數(shù)據(jù)的過程中,還會(huì)碰到類似于

SQLException :Incorrect string value: '\xF0\xA1\x8B\xBE\xE5\xA2...' for column 'name'

這樣的錯(cuò)誤信息,這是由于mysql中設(shè)置的utf-8是默認(rèn)3個(gè)字節(jié)的,對(duì)于一般的數(shù)據(jù)是沒有問題的,如果是大的數(shù)據(jù)量,里面難免會(huì)包含一些微信表情,或者特殊字符,它們占了4個(gè)字節(jié),utf-8不能處理,所以報(bào)錯(cuò)。解決的辦法就是mysql在5.5.3以后的版本引入了4個(gè)字節(jié)的utf-8編碼,也就是utf8mb4,需要對(duì)mysql的編碼重新設(shè)置。

可以按照以下步驟進(jìn)行操作,一是對(duì)要修改的數(shù)據(jù)庫(kù)進(jìn)行備份,雖然utf8mb4是向下兼容utf8的,但為了以防操作不當(dāng),還是需要防患于未然,做好備份工作。二是要修改數(shù)據(jù)庫(kù)的字符集編碼為utf8mb4—UTF-8 Unicode,排序規(guī)則utf8mb4_general_ci。以上修改我是使用navicat進(jìn)行修改的,如何用命令行修改,大家可以自行查找。三是要修改配置文件my.ini,在mysql安裝的根目錄下。加入以下設(shè)置。

[client]
default-character-set = utf8mb4
[mysqld]
character-set-server=utf8mb4
collation-server=utf8mb4_general_ci
[mysql]
default-character-set = utf8mb4

修改完成后,需要重新啟動(dòng)mysql,使修改生效。

然后再進(jìn)行數(shù)據(jù)的導(dǎo)入工作,應(yīng)該就可以正常導(dǎo)入了。

3 大批量導(dǎo)入的時(shí)間效率問題

由于我們的數(shù)據(jù)量比較大,我們把數(shù)據(jù)進(jìn)行了分割,我把6500萬(wàn)條數(shù)據(jù)分為500個(gè)文件,每個(gè)文件大約11萬(wàn)條數(shù)據(jù),將這11萬(wàn)條數(shù)據(jù)放到ArrayList<TripleObject>中,然后批量導(dǎo)入。大概的思路是采用“insert into tb (...) values(...),(...)...;”的方法,用insert一次性插入,這樣時(shí)間會(huì)節(jié)約很多時(shí)間。示例方法如下。

public static void insertSQL(String sql,List<TripleObject> tripleObjectList) throws SQLException{
    Connection conn=null;
    PreparedStatement psts=null;
    try {
      conn=DriverManager.getConnection(Common.URL, Common.DB_USERNAME, Common.DB_PASSWORD);
      conn.setAutoCommit(false); // 設(shè)置手動(dòng)提交 
      // 保存sql后綴
      StringBuffer suffix = new StringBuffer();
      int count = 0; 
      psts=conn.prepareStatement("");
      String s="";
      String p="";
      String o="";
      while (count<tripleObjectList.size()) {
        s=tripleObjectList.get(count).getSubject().replaceAll(",", ".").replaceAll("\\(", "").replaceAll("\\)", "").replaceAll("\'", "").replaceAll("\\\\", "");
        p=tripleObjectList.get(count).getPredicate().replaceAll(",", ".").replaceAll("\\(", "").replaceAll("\\)", "").replaceAll("\'", "").replaceAll("\\\\", "");
        o=tripleObjectList.get(count).getObject().replaceAll(",", ".").replaceAll("\\(", "").replaceAll("\\)", "").replaceAll("\'", "").replaceAll("\\\\", "");
        suffix.append("('" +s +"','"+p+"','"+ o+"'),");
        count++;
      }
      // 構(gòu)建完整SQL
      String allsql = sql + suffix.substring(0, suffix.length() - 1);
      // 添加執(zhí)行SQL
      psts.addBatch(allsql);
      psts.executeBatch(); // 執(zhí)行批量處理 
      conn.commit(); // 提交 
    } catch (Exception e) {
      e.printStackTrace();
    }finally{
      if(psts!=null){
        psts.close();
      }
      if(conn!=null){
        conn.close();
      }
    }
  }

這種方法的優(yōu)點(diǎn)是導(dǎo)入數(shù)據(jù)花費(fèi)的時(shí)間會(huì)很少,6500萬(wàn)條數(shù)據(jù),用了正好1個(gè)小時(shí)。缺點(diǎn)是如果數(shù)據(jù)中有一大段的句子,需要對(duì)里面的逗號(hào),括號(hào),反斜線等進(jìn)行處理,這里需要進(jìn)行衡量,是否使用該方法。

如果正常插入,也就是使用“insert into tb (...) values(...);insert into tb (...) values(...);……”的形式,則不用處理特殊的符號(hào),但花費(fèi)的時(shí)間會(huì)很長(zhǎng),我測(cè)試了一下,11萬(wàn)條數(shù)據(jù)大約需要12分鐘左右,導(dǎo)入6500萬(wàn)條數(shù)據(jù)大概要100個(gè)小時(shí)。

我們采用的是第一種方法,數(shù)據(jù)大概可以查看就可以,對(duì)數(shù)據(jù)要求沒有那么嚴(yán)格,節(jié)約了時(shí)間。

以上是我在往mysql中導(dǎo)入大批量數(shù)據(jù)時(shí)碰到的問題,以及所想到的解決方法,如果大家有更好的解決方法,或者碰到其他的問題,希望一起討論。

相關(guān)文章

  • mysql Out of memory (Needed 16777224 bytes)的錯(cuò)誤解決

    mysql Out of memory (Needed 16777224 bytes)的錯(cuò)誤解決

    至于我改的這幾個(gè)值是不是正確的解決方法,目前還不知道。先貼出來(lái)
    2012-07-07
  • mysql用戶管理和權(quán)限設(shè)置方式

    mysql用戶管理和權(quán)限設(shè)置方式

    這篇文章主要介紹了mysql用戶管理和權(quán)限設(shè)置方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-08-08
  • 重裝MySQL最后一步失敗的完美解決方案(經(jīng)驗(yàn)總結(jié))

    重裝MySQL最后一步失敗的完美解決方案(經(jīng)驗(yàn)總結(jié))

    使用MySQL都有過重裝的經(jīng)歷,要是重裝MySQL基本都是在最后一步通不過,究竟是什么原因呢?下面是我總結(jié)的一點(diǎn)經(jīng)驗(yàn),都是血的教訓(xùn)
    2014-06-06
  • 一文總結(jié)使用MySQL時(shí)遇到null值的坑

    一文總結(jié)使用MySQL時(shí)遇到null值的坑

    這篇文章給大家總結(jié)了日常使用MySQL時(shí),容易遇到NULL值的坑有哪些,文章通過代碼示例給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下
    2024-01-01
  • 最新版MySQL 8.0.22下載安裝超詳細(xì)教程(Windows 64位)

    最新版MySQL 8.0.22下載安裝超詳細(xì)教程(Windows 64位)

    這篇文章主要介紹了最新版MySQL 8.0.22下載安裝超詳細(xì)教程(Windows 64位),本文通過圖文實(shí)例相結(jié)合給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-12-12
  • MySQL進(jìn)行表之間關(guān)聯(lián)更新的實(shí)現(xiàn)方法

    MySQL進(jìn)行表之間關(guān)聯(lián)更新的實(shí)現(xiàn)方法

    在實(shí)際編程工作或運(yùn)維實(shí)踐中,對(duì)MySQL數(shù)據(jù)庫(kù)表進(jìn)行關(guān)聯(lián)更新是一種比較常見的應(yīng)用場(chǎng)景,針對(duì)這樣的業(yè)務(wù)場(chǎng)景,我們來(lái)看看有什么方法可以實(shí)現(xiàn)關(guān)聯(lián)更新,需要的朋友可以參考下
    2023-10-10
  • MySQL數(shù)據(jù)庫(kù)高級(jí)數(shù)據(jù)操作之新增數(shù)據(jù)

    MySQL數(shù)據(jù)庫(kù)高級(jí)數(shù)據(jù)操作之新增數(shù)據(jù)

    這篇文章主要介紹了MySQL數(shù)據(jù)庫(kù)高級(jí)數(shù)據(jù)操作之新增數(shù)據(jù),文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-06-06
  • mysql的sql語(yǔ)句特殊處理語(yǔ)句總結(jié)(必看)

    mysql的sql語(yǔ)句特殊處理語(yǔ)句總結(jié)(必看)

    下面小編就為大家?guī)?lái)一篇mysql的sql語(yǔ)句特殊處理語(yǔ)句總結(jié)(必看)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來(lái)看看吧
    2017-03-03
  • mysql如何開啟各種日志

    mysql如何開啟各種日志

    這篇文章主要介紹了mysql如何開啟各種日志,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • mysql5.5中文亂碼問題解決的有用方法

    mysql5.5中文亂碼問題解決的有用方法

    在使用MYSQL時(shí)遇到中文亂碼的問題,表現(xiàn)為插入數(shù)據(jù)后查詢時(shí)輸出為??(亂碼),下面這篇文章主要給大家介紹了關(guān)于mysql5.5中文亂碼問題解決的有用方法,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2022-05-05

最新評(píng)論