MYSQLg高级------批量插入百万级数据量

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
简介: MYSQLg高级------批量插入百万级数据量

为了更好的展示

先建立一张表:作为测试使用

create database bigData;
use bigData;
CREATE TABLE dept(
  id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
  deptno MEDIUMINT UNSIGNED NOT NULL DEFAULT 0,
  dname VARCHAR(20)NOT NULL DEFAULT "",
  loc VARCHAR(13) NOT NULL DEFAULT ""
)ENGINE=INNODB DEFAULT CHARSET=utf8;
CREATE TABLE emp(
    id int unsigned primary key auto_increment,
    empno mediumint unsigned not null default 0,
    ename varchar(20) not null default "",
    job varchar(9) not null default "",
    mgr mediumint unsigned not null default 0,
    hiredate date not null,
    sal decimal(7,2) not null,
    comm decimal(7,2) not null,
    deptno mediumint unsigned not null default 0
)ENGINE=INNODB DEFAULT CHARSET=utf8;


开启了可以创建存储函数的权限,主要是这个功能


设置参数log_bin_trust_function_creators


# 在mysql中设置 
# log_bin_trust_function_creators 默认是关闭的 需要手动开启
mysql> SHOW VARIABLES LIKE 'log_bin_trust_function_creators';
+---------------------------------+-------+
| Variable_name                   | Value |
+---------------------------------+-------+
| log_bin_trust_function_creators | OFF   |
+---------------------------------+-------+
1 row in set (0.00 sec)
mysql> SET GLOBAL log_bin_trust_function_creators=1;
Query OK, 0 rows affected (0.00 sec)


上述修改方式MySQL重启后会失败,在my.cnf配置文件下修改永久有效。


windows下my.ini[mysqld]加上log_bin_trust_function_creators=1
linux下/etc/my.cnf 下my.cnf[mysqld]加上log_bin_trust_function_creators=1
[mysqld]
log_bin_trust_function_creators=1


上面的作用就是为了下的 $$ (函数;的表达式)更好的执行;重启或者重新连接即可恢复默认


创建函数,保证每条数据都不同


随机产生字符串


#随机产生字符串
#create function  建函数
#returns 返回值
#i int default 0;  i int 类型从0开始
delimiter $$ # 两个 $$ 表示结束函数中使用(可理解为正常使用 )
create function rand_string(n int) returns varchar(255)
begin
    declare chars_str varchar(100) default 'abcdefghijklmnopqrstuvwxyz';
    declare return_str varchar(255) default '';
    declare i int default 0;
    while i < n do
        set return_str = concat(return_str,substring(chars_str,floor(1+rand()*52),1));
        set i=i+1;
    end while;
    return return_str;
end $$


执行完语句后,在终端上输入select rand_string(2)$$;,要以$$结尾


随机产生部门编号

delimiter $$
create function rand_num() returns int(5)
begin
    declare i int default 0;
    set i=floor(100+rand()*10);
    return i;
end $$


执行完语句后,在终端上输入select rand_num()$$,要以$$结尾


创建存储过程,创建往emp表中插入数据的存储过程


delimiter $$
create procedure insert_emp(in start int(10),in max_num int(10))
begin
    declare i int default 0;
    set autocommit = 0;
    repeat
        set i = i+1;
        insert into emp(empno,ename,job,mgr,hiredate,sal,comm,deptno) values((start+i),rand_string(6),'salesman',0001,curdate(),2000,400,rand_num());
        until i=max_num
        end repeat;
    commit;
end $$


重点语句分析


新增语句前面的emp(empno,ename,job,mgr,hiredate,sal,comm,deptno) 都是正常的新增语句;


values((start+i),rand_string(6),‘salesman’,0001,curdate(),2000,400,rand_num());


(start+i):


rand_string(6): (6) 长度最大为6

salesman:默认值;所有的值都是这个不变的

0001:所有的值都是1 也是不变的

curdate():当前得到时间应该是函数得一种写法;(具体的不了解;抱歉)


2000:都是默认值

400:都是默认值


rand_num():

上面就是他的一个完整的解释;不足之处请多多指教;

insert into emp(empno,ename,job,mgr,hiredate,sal,comm,deptno) values((start+i),rand_string(6),'salesman',0001,curdate(),2000,400,rand_num());

创建往dept表中插入数据的存储过程

delimiter $$
create procedure insert_dept(in start int(10),in max_num int(10))
begin
    declare i int default 0;
    set autocommit = 0;
    repeat
        set i = i+1;
        insert into dept(deptno,dname,loc) values((start+i),rand_string(10),rand_string(8));
        until i=max_num
        end repeat;
    commit;
end $$


调用存储过程

往dept表中插入数据

DELIMITER ;
CALL insert_dept(100, 10);


往emp表中插入50万数据

DELIMITER ;
CALL insert_emp(100001, 500000);


CALL insert_dept(100, 10);

CALL insert_emp(100001, 500000);


就好像我们执行接口一样为接口传入需要的参数进行执行;他们的2给参数分别是:从多少条开始,执行多少条;


整体过程梳理:(本人就是这样执行的)



#创建部门表 dept
CREATE TABLE dept(
  id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
  deptno MEDIUMINT UNSIGNED NOT NULL DEFAULT 0,
  dname VARCHAR(20)NOT NULL DEFAULT "",
  loc VARCHAR(13) NOT NULL DEFAULT ""
)ENGINE=INNODB DEFAULT CHARSET=utf8;
#创建员工表 emp
CREATE TABLE (
    id int unsigned primary key auto_increment,
    empno mediumint unsigned not null default 0,
    ename varchar(20) not null default "",
    job varchar(9) not null default "",
    mgr mediumint unsigned not null default 0,
    hiredate date not null,
    sal decimal(7,2) not null,
    comm decimal(7,2) not null,
    deptno mediumint unsigned not null default 0
)ENGINE=INNODB DEFAULT CHARSET=utf8;
#查看存储函数的权限
SHOW VARIABLES LIKE 'log_bin_trust_function_creators';
#开启存储函数的权限(临时重启效果消失)
SET GLOBAL log_bin_trust_function_creators=1;
#查看当前
select now() from dual;
#随机产生字符串
#create function  建函数
#returns 返回值
#i int default 0;  i int 类型从0开始
delimiter $$ # 两个 $$ 表示结束函数中使用(可理解为正常使用 )
create function rand_string(n int) returns varchar(255)
begin
    declare chars_str varchar(100) default 'abcdefghijklmnopqrstuvwxyz';
    declare return_str varchar(255) default '';
    declare i int default 0;
    while i < n do
        set return_str = concat(return_str,substring(chars_str,floor(1+rand()*52),1));
        set i=i+1;
    end while;
    return return_str;
end $$
#随机产生部门编号
delimiter $$
create function rand_num() returns int(5)
begin
    declare i int default 0;
    set i=floor(100+rand()*10);
    return i;
end $$
#创建存储过程,创建往emp表中插入数据的存储过程
#insert_emp 调用名字后面会用
delimiter $$
create procedure insert_emp(in start int(10),in max_num int(10))#从什么时候开始到什么时候结束
begin
    declare i int default 0;
  #自动提交关闭,否则写一次提交一次;
    set autocommit = 0;
    repeat
        set i = i+1;
        insert into emp(empno,ename,job,mgr,hiredate,sal,comm,deptno) values((start+i),rand_string(6),'salesman',0001,curdate(),2000,400,rand_num());
        until i=max_num
        end repeat;
    commit;
end $$
#插入dept 数据
delimiter $$
create procedure insert_dept(in start int(10),in max_num int(10))
begin
    declare i int default 0;
    set autocommit = 0;
    repeat
        set i = i+1;
        insert into dept(deptno,dname,loc) values((start+i),rand_string(10),rand_string(8));
        until i=max_num
        end repeat;
    commit;
end $$
#从100开始插入10条数据 dept
DELIMITER ;
CALL insert_dept(100, 10);
SELECT * from dept
#往emp表中插入50万数据
DELIMITER ;
CALL insert_emp(100001, 500000);
#查看ok 成功了
SELECT * from emp


下面贴下部分图片;



50万数据到手了;哈哈

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
存储 Java 关系型数据库
|
1月前
|
存储 Oracle 关系型数据库
【实操】单表数据量 200 GB,PostgreSQL 怎么应对??
【实操】单表数据量 200 GB,PostgreSQL 怎么应对??
76 1
|
5月前
|
存储 关系型数据库 分布式数据库
PolarDB产品使用问题之在处理超过5000万条记录的查询时,性能表现如何
PolarDB产品使用合集涵盖了从创建与管理、数据管理、性能优化与诊断、安全与合规到生态与集成、运维与支持等全方位的功能和服务,旨在帮助企业轻松构建高可用、高性能且易于管理的数据库环境,满足不同业务场景的需求。用户可以通过阿里云控制台、API、SDK等方式便捷地使用这些功能,实现数据库的高效运维与持续优化。
|
6月前
|
SQL 关系型数据库 MySQL
MySQL 百万级数据量分页查询方法及其优化
MySQL 百万级数据量分页查询方法及其优化
234 0
|
存储 关系型数据库 MySQL
百万数据怎么入库mysql mysql百万级数据
      1、连接数据库的问题:建立连接和关闭连接的次数太多,导致IO访问次数太频繁。        2、应该使用批量插入和批量修改的方法,而不是有一条数据就进行插入,这样会导致访问数据库的实际特别的慢。
|
存储 关系型数据库 MySQL
30分布式电商项目 - 一亿条数据插入MySQL,耗时多少?
30分布式电商项目 - 一亿条数据插入MySQL,耗时多少?
217 0
|
SQL 关系型数据库 MySQL
MySQL 百万级数据分页查询及优化
MySQL 百万级数据分页查询及优化
308 0
Kam
|
SQL 存储 关系型数据库
|
SQL 算法 Java
百万级别数据Excel导出优化
这篇文章不是标题党,下文会通过一个仿真例子分析如何优化百万级别数据Excel导出。
930 0
百万级别数据Excel导出优化
|
关系型数据库
PostgreSQL 百亿级数据范围查询, 分组排序窗口取值 极致优化 case
本文将对一个任意范围按ID分组查出每个ID对应的最新记录的CASE做一个极致的优化体验。优化后性能维持在可控范围内,任意数据量,毫秒级返回,性能平稳可控。比优化前性能提升1万倍。 CASE如下: 有一张数据表,结构: CREATE TABLE target_position
16108 0