前言
目標快速模擬數據一億條, 存儲過程效率太低, 找到個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應用之通過存儲過程方式批量插入數據