mysql導入千萬級數據實操


前言

目標快速模擬數據一億條, 存儲過程效率太低, 找到個load data的方法, 從本地文件讀數據插入到庫表中, 正文如下

正文

切換引擎

查詢引擎類型

SHOW CREATE TABLE igs_sm_interface_access_log;

查詢結果

CREATE TABLE `igs_sm_interface_access_log` (
  `interface_request_seq` varchar(100) NOT NULL,
  `user_id` varchar(50) DEFAULT NULL,
  `interface_access_func_name_cn` varchar(100) DEFAULT NULL,
  `interface_access_method_name_cn` varchar(100) DEFAULT NULL,
  `interface_access_method_type_name_en` varchar(100) DEFAULT NULL,
  `interface_response_status_cd` varchar(10) DEFAULT NULL,
  `begin_datetime` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP,
  `end_datetime` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`interface_request_seq`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

 將InnoDB切換為

ALTER TABLE igs_sm_interface_access_log ENGINE = MyISAM

查看切換結果

CREATE TABLE `igs_sm_interface_access_log` (
  `interface_request_seq` varchar(100) NOT NULL,
  `user_id` varchar(50) DEFAULT NULL,
  `interface_access_func_name_cn` varchar(100) DEFAULT NULL,
  `interface_access_method_name_cn` varchar(100) DEFAULT NULL,
  `interface_access_method_type_name_en` varchar(100) DEFAULT NULL,
  `interface_response_status_cd` varchar(10) DEFAULT NULL,
  `begin_datetime` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP,
  `end_datetime` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`interface_request_seq`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8

 

xxx操作

禁用

ALTER TABLE igs_sm_interface_access_log DISABLE KEYS 

查看執行文件權限

SHOW VARIABLES LIKE '%local%'

 修改執行文件權限

SET GLOBAL local_infile=1;-- 1 ON 0 OFF

 

向文件中插入記錄

public static void main(String[] args) {
        //procedure_partition_test2_188||100188||test_模塊||test_模塊_方法||SEARCH||SUCCESS||2020-10-27 19:38:54||2020-10-27 19:38:54
        String sdf = "yyyy-MM-dd HH:mm:ss";
        Date date = new Date();
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        SimpleDateFormat dateFormat = new SimpleDateFormat(sdf);
        File file = new File("C:\\Users\\Administrator\\Desktop\\load_data2.txt");
        String center = "||100188||test_模塊||test_模塊_方法||SEARCH||SUCCESS||";
        long start = System.currentTimeMillis();
        System.out.println("start:[" + start + "]");
        try {
            PrintWriter pfp = new PrintWriter(file, "UTF-8");
            for (int j = 0; j < 30; j++) {
                String id_prefix = "procedure_partition_test" + j + "_";
                calendar.add(Calendar.DAY_OF_MONTH, -1);
                Date time = calendar.getTime();
                String yesterday = dateFormat.format(time);
                String start_datetime = yesterday;
                String end_datetime = yesterday;
                for (int i = 0; i < 300000; i++) {
                    StringBuffer sb = new StringBuffer();
                    sb.append(id_prefix).append(i).append(center).append(start_datetime).append("||").append(end_datetime);
                    pfp.print(sb.toString() + "\n");
                }
            }
            pfp.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }

        long end = System.currentTimeMillis();
        System.out.println("end:[" + end + "]");
        System.out.println("耗時:[" + (end - start) / 1000 + "s]");

    }

load data 執行sql

load data local infile 'C:\\Users\\Administrator\\Desktop\\load_data2.txt' into table igs_sm_interface_access_log
CHARACTER SET utf8 -- 可選,避免中文亂碼問題
FIELDS TERMINATED BY '||' -- 字段分隔符,每個字段(列)以什么字符分隔,默認是 \t
    OPTIONALLY ENCLOSED BY '' -- 文本限定符,每個字段被什么字符包圍,默認是空字符
    ESCAPED BY '\\' -- 轉義符,默認是 \
LINES TERMINATED BY '\n' -- 記錄分隔符,如字段本身也含\n,那么應先去除,否則load data 會誤將其視作另一行記錄進行導入
(
    interface_request_seq,
    user_id,
    interface_access_func_name_cn,
    interface_access_method_name_cn,
    interface_access_method_type_name_en,
    interface_response_status_cd,
    begin_datetime,
    end_datetime
) -- 每一行文本按順序對應的表字段,建議不要省略

本地執行結果: 測試數據是900萬條, 855秒, 文件大小1.11G

換回測試環境庫執行

 

最后記得把表的引擎切換回InnoDB, 啟用keys, 執行本地文件權限

ALTER TABLE igs_sm_interface_access_log ENGINE = InnoDB
ALTER TABLE igs_sm_interface_access_log ENABLE KEYS
SET GLOBAL local_infile=0

引擎切換這步耗時不是一般的久。 

 

感謝

java實現寫大量數據到文件中

MySQL8.0加載文件內容報錯: ERROR 1148: The used command is not allowed with this MySQL version

Mysql修改數據庫引擎類型

MySQL load data 快速導入大批量數據

mysql快速保存插入大量數據一些方法總結

mysql應用之通過存儲過程方式批量插入數據

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM