mysql导入千万级数据实操

摘要:
前言目标是快速模拟1亿条数据。存储过程的效率太低。查找加载数据的方法。从本地文件读取数据并将其插入数据库表。文本如下:切换引擎查询引擎类型SHOWCREATETABLEEigs_sm_interface_access_log;查询结果创建`igs_sm_interface_access_log`(`interface_request_seq`varchar(100)NOTNULL,

前言

目标快速模拟数据一亿条, 存储过程效率太低, 找到个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() + "
");
                }
            }
            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 '||' -- 字段分隔符,每个字段(列)以什么字符分隔,默认是 	
    OPTIONALLY ENCLOSED BY '' -- 文本限定符,每个字段被什么字符包围,默认是空字符
    ESCAPED BY '\' -- 转义符,默认是 
LINES TERMINATED BY '
' -- 记录分隔符,如字段本身也含
,那么应先去除,否则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, 亿级的有时间再测吧...

mysql导入千万级数据实操第1张

换回测试环境库执行

mysql导入千万级数据实操第2张

最后记得把表的引擎切换回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应用之通过存储过程方式批量插入数据

免责声明:文章转载自《mysql导入千万级数据实操》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇如何实现点击下载图片(或文件)Cocos网络篇[3.2](3) ——Socket连接(1)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Access数据库 字段值 字符替换

两种方法: (一)Access数据库内部使用方法 Update 表 SET 字段=replace(字段,"原字符","替换字符") 示例: 假设表为biao、字段为content、原字符为xiazai.jb51.net、替换字符为down1.jb51.net, 那么相应的SQL语句如下:Update biao SET content=replace(co...

【Swift】WKWebView与JS的交互使用

一、前言   近日,有朋友问我关于WKWebView与JS的交互问题,可我之前一直使用的是UIWebView,也不曾做过WKWebView的交互啊!接下来大家一块学习下WKWebView是怎么实现原生代码和JS交互的。2016年时候曾写过一篇关于UIWebView与JS的交互。传送门>>> 二、WKWebView 支持更多的HTML5的...

Unicode基本概念

Unicode是计算机可以支持这个星球上多种语言的秘密武器。通过使用一个或者多个字节来表示一个字符的方法突破了ASCII的限制。Unicode可以表示超过90000个字符。 使用方式:a=u'hello' #Unicode String String的内建函数str()和chr()并没有升级来处理Unicode,新的内建函数unicode()和unichar...

C#编程总结(八)数字签名

C#编程总结(八)数字签名 在日常工作中,有很多文件需要领导审阅、签名和盖章,由于公司业务开展,跨地域、跨国业务也日益普遍,领导签名盖章变得很麻烦,开始的时候人们通过邮寄、传真等方式来解决,但是耗费时间、人力、物力。在网络化日益深入的今天,需要领导审批、签字盖章的东西越来越多,时间也越来越紧迫,数字签名的出现,很好了解决了这一问题。推动了互联网及跨国集团的...

PHP的加密方法汇总

PHP的加密主要有4种方法,除此之外还有一种是URL的加密和解密。希望可以对你们开发有用。 顺带,我会在后面把我整理的一整套CSS3,PHP,MYSQL的开发的笔记打包放到百度云,有需要可以直接去百度云下载,这样以后你们开发就可以直接翻笔记不用百度搜那么麻烦了。  笔记链接:http://pan.baidu.com/s/1qYdQdKK 密码:pvj2  ...

在Ubuntu18.04下安装mysql没有初始密码,设置root密码

解决方法 注:此处mysql为5.7版本 1、在终端上输入 sudo cat /etc/mysql/debian.cnf 找到安装时默认生成的默认账户的账号和密码 2、用得到的账户和密码登录mysql,这里的密码一定要用查到的那个密码 3、然后修改密码 use mysql; #连接到mysql数据库 update mysql.user set aut...