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

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS PostgreSQL,高可用系列 2核4GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 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万数据到手了;哈哈

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 &nbsp; 相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/mysql&nbsp;
相关文章
|
SQL 缓存 关系型数据库
如何优化分页查询的性能?
【8月更文挑战第3天】如何优化分页查询的性能?
661 37
|
Linux 虚拟化 iOS开发
macOS Sequoia 15.1 发布下载,Apple 智能准备就绪
macOS Sequoia 15.1 发布下载,Apple 智能准备就绪
554 11
macOS Sequoia 15.1 发布下载,Apple 智能准备就绪
|
Ubuntu Linux Shell
Sentieon软件快速入门指南
Sentieon为纯CPU计算加速软件,完全适配主流CPU计算架构:Intel、AMD、海光等X86架构CPU,华为鲲鹏、阿里倚天等ARM架构CPU。可灵活部署在实验室单机工作站、HPC集群、超算中心和云计算中心,保持同一套流程下不同规模数据计算结果的一致性。Sentieon软件团队拥有丰富的软件开发及算法优化工程经验,致力于解决生物数据分析中的速度与准确度瓶颈,为来自于分子诊断、药物研发、临床医疗、人群队列、动植物等多个领域的合作伙伴提供高效精准的软件解决方案,共同推动基因技术的发展。
511 4
Sentieon软件快速入门指南
|
SQL Java Apache
实时计算 Flink版操作报错合集之使用parquet时,怎么解决报错:无法访问到java.uti.Arrays$ArrayList类的私有字段
在使用实时计算Flink版过程中,可能会遇到各种错误,了解这些错误的原因及解决方法对于高效排错至关重要。针对具体问题,查看Flink的日志是关键,它们通常会提供更详细的错误信息和堆栈跟踪,有助于定位问题。此外,Flink社区文档和官方论坛也是寻求帮助的好去处。以下是一些常见的操作报错及其可能的原因与解决策略。
|
机器学习/深度学习 人工智能 自然语言处理
深度学习与自然语言处理的融合:重塑语言理解的未来
【8月更文挑战第5天】在自然语言处理(NLP)领域,深度学习技术引发了一场革命,极大提升了语言理解与生成能力。本文探讨深度学习与NLP的融合现状、关键技术如RNN、LSTM、GRU及Transformer模型,预训练语言模型如BERT和GPT的作用,以及迁移学习的应用。这些技术已在机器翻译、文本分类、智能客服等多个场景取得显著成果,并展望未来模型效率、可解释性、跨模态融合及个性化服务等发展趋势。
|
人工智能 运维 Devops
云效DevOps:企业数字化转型的必经之路
【6月更文挑战第11天】云效DevOps助力企业数字化转型,通过自动化、持续集成、持续部署,强化开发与运维协作。它降低沟通成本,提升开发效率,实现快速迭代。例如,Jenkinsfile示例展示了从代码提交到上线的自动化流程。此外,云效DevOps的CI/CD促进快速响应市场变化,统一协作平台加强团队合作,提升整体效率。
190 3
|
人机交互 分布式数据库 数据库
软考之决策支持系统的概念
软考之决策支持系统的概念
383 3
|
监控 负载均衡 网络协议
网关冗余:确保网络连通性的关键技术
【4月更文挑战第22天】
713 6
|
Linux Shell Python
如何计算 Linux 上文件中的空行数?
【5月更文挑战第11天】
321 0
|
弹性计算 安全 Linux
阿里云Linux服务器安装宝塔面板教程(详细流程)
阿里云Linux服务器安装宝塔面板教程(详细流程)
1412 0