mysql模拟千万级数据

获得数据的方式

  • Mysql过程调用的方式。
  • EasyExcel数据导入的方式。
  • JAVA + MYBATIS批插入方式。
  • 通过爬虫爬取接口数据、网页数据的方式

Mysql过程调用方式

通过实验发现这种方式的执行效率并不高,当单次数据量达到50000条的时候需要执行46秒左右

-- 允许mysql创建函数
set global log_bin_trust_function_creators=TRUE;

-- 部门表
create table if not EXISTS 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 ""
);

-- 员工表
create table if not EXISTS 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,
	comn decimal(7,2) not null,
	deptno mediumint unsigned not null default 0
);

# 随机产生字符串

DELIMITER $$ 
CREATE FUNCTION if not EXISTS rand_string(n INT) RETURNS VARCHAR(255)
BEGIN
	DECLARE chars_str VARCHAR(100) DEFAULT 'abcdefghijklmlopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
	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 if not EXISTS rand_num() RETURNS INT(5)
BEGIN
	DECLARE i INT DEFAULT 0;
	SET i = FLOOR(100+RAND()*10);
	RETURN i;
END $$

# 创建往emp表中插入数据的存储过程
DELIMITER $$
CREATE PROCEDURE if not EXISTS insert_emp(IN START INT(10),IN max_num INT(10))
BEGIN
	DECLARE i INT DEFAULT 0;
	# set autocommit =0 把autocommit设置成0,把默认提交关闭
	SET autocommit = 0;
	REPEAT
	SET i = i + 1;
	INSERT INTO emp(empno,ename,job,mgr,hiredate,sal,comn,deptno) VALUES ((START+I),rand_string(6),'SALEMAN',0001,now(),2000,400,rand_num());
	UNTIL i = max_num
	END REPEAT;
	COMMIT;
END $$


-- 测试while循环
DELIMITER $$
CREATE PROCEDURE if not EXISTS test(IN START INT(10))
BEGIN
	DECLARE i INT DEFAULT 0;
	# set autocommit =0 把autocommit设置成0,把默认提交关闭
	WHILE i < START do
	set i = i + 1;
	end WHILE;
	SELECT i;
END $$
CALL test(10);

SELECT count(*) FROM emp e ORDER BY e.id desc;


# dept插入数据的存储过程
DELIMITER $$
CREATE PROCEDURE if not EXISTS 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 $$

-- 插入10000条数据 执行10s
call insert_dept(0,10000);
-- 插入10000条数据 执行2.3s
call insert_emp(0,10000);

-- 清空表数据
-- TRUNCATE dept
-- TRUNCATE emp

原文链接:https://blog.csdn.net/qq_35010942/article/details/93376498

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值