主頁 > 知識庫 > 分析Mysql大量數(shù)據(jù)導入遇到的問題以及解決方案

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

熱門標簽:哈爾濱crm外呼系統(tǒng)價格 做地圖標注都需要什么工具 西安400電話在哪里辦理 甘孜電話機器人廠家 上海智能外呼系統(tǒng)需要多少錢 電銷機器人好品牌門薩維l 銀川電銷外呼系統(tǒng)定制 凱立德科技館地圖標注 中科嘉智人工智能電銷機器人

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

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

以上是一個大概的思路,下面是具體導入過程中碰到的問題。

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

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

URL="jdbc:mysql://"+IP+":"+PORT+"/"+DB_NAME+"?useSSL=falseuseUnicode=truecharacterEncoding=utf-8";

把編碼設置為UTF-8是解決亂碼問題,設置useSSL是解決JDBC與mysql的兼容問題。如果不設置useSSL,會報錯。類似于

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.

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

2 utf8mb4編碼問題

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

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

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

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

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

修改完成后,需要重新啟動mysql,使修改生效。

然后再進行數(shù)據(jù)的導入工作,應該就可以正常導入了。

3 大批量導入的時間效率問題

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

public static void insertSQL(String sql,ListTripleObject> tripleObjectList) throws SQLException{
    Connection conn=null;
    PreparedStatement psts=null;
    try {
      conn=DriverManager.getConnection(Common.URL, Common.DB_USERNAME, Common.DB_PASSWORD);
      conn.setAutoCommit(false); // 設置手動提交 
      // 保存sql后綴
      StringBuffer suffix = new StringBuffer();
      int count = 0; 
      psts=conn.prepareStatement("");
      String s="";
      String p="";
      String o="";
      while (counttripleObjectList.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)點是導入數(shù)據(jù)花費的時間會很少,6500萬條數(shù)據(jù),用了正好1個小時。缺點是如果數(shù)據(jù)中有一大段的句子,需要對里面的逗號,括號,反斜線等進行處理,這里需要進行衡量,是否使用該方法。

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

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

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

您可能感興趣的文章:
  • 將sqlite3中數(shù)據(jù)導入到mysql中的實戰(zhàn)教程
  • php基于Fleaphp框架實現(xiàn)cvs數(shù)據(jù)導入MySQL的方法
  • MySQL中數(shù)據(jù)導入恢復的簡單教程
  • PHP把MSSQL數(shù)據(jù)導入到MYSQL的方法
  • MySQL中使用load data命令實現(xiàn)數(shù)據(jù)導入的方法
  • 解析csv數(shù)據(jù)導入mysql的方法
  • phpMyAdmin下將Excel中的數(shù)據(jù)導入MySql的圖文方法
  • 3步搞定純真IP數(shù)據(jù)導入到MySQL的方法詳解
  • Excel數(shù)據(jù)導入Mysql數(shù)據(jù)庫的實現(xiàn)代碼
  • 如何把ACCESS的數(shù)據(jù)導入到Mysql中
  • MYSQL大數(shù)據(jù)導入

標簽:浙江 那曲 四川 濮陽 山南 安徽 安康 平頂山

巨人網(wǎng)絡通訊聲明:本文標題《分析Mysql大量數(shù)據(jù)導入遇到的問題以及解決方案》,本文關鍵詞  分析,Mysql,大量,數(shù)據(jù),導入,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡,涉及言論、版權(quán)與本站無關。
  • 相關文章
  • 下面列出與本文章《分析Mysql大量數(shù)據(jù)導入遇到的問題以及解決方案》相關的同類信息!
  • 本頁收集關于分析Mysql大量數(shù)據(jù)導入遇到的問題以及解決方案的相關信息資訊供網(wǎng)民參考!
  • 推薦文章