MySQL批量插入测试数据
有时候我们需要往表中批量插入几万甚至几十万条数据,这时候总不可能手工一条条插入的,这估计得累死人,可以利用MySQL的函数和存储过来实现这个需求。
1、建立测试需要的表
CREATE TABLE `dept` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`deptName` VARCHAR(30) DEFAULT NULL,
`address` VARCHAR(40) DEFAULT NULL,
ceo INT NULL ,
PRIMARY KEY (`id`)
) ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
CREATE TABLE `emp` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`empno` INT NOT NULL ,
`name` VARCHAR(20) DEFAULT NULL,
`age` INT(3) DEFAULT NULL,
`deptId` INT(11) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
2、参数设置
MySQL有一个参数log_bin_trust_function_creators
,当二进制日志启用后,这个变量就会启用,目的是为了控制是否信任存储函数的创建者,不会创建写入引起二进制日志不安全事件的存储函数。默认值为0,表示不允许创建或修改存储函数。
如果在变量值为0的情况下创建存储函数,就会报错
ERROR 1418 (HY000): This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in its declaration and binary logging is enabled (you *might* want to use the less safe log_bin_trust_function_creators variable)
那么为什么MySQL有这样的限制呢? 因为二进制日志的一个重要功能是用于主从复制,而存储函数有可能导致主从的数据不一致。所以当开启二进制日志后,参数log_bin_trust_function_creators就会生效,限制存储函数的创建、修改、调用。
所以为了测试,我们需要把该参数打开,不然没法玩了。注意使用命令打开,重启后就会失效,如果要永久生效,需要修改my.cnf。
3、编写随机函数
这里需要两个随机函数就够了,一个产生随机数字,一个产生随机字符串。
3.1 产生随机字符串
-- 定义分隔符为$$,不然遇到;就会结束
DELIMITER $$
-- 函数名为rand_string,入参为n,类型为int,返回值为varchar类型,长度为255
CREATE FUNCTION rand_string(n INT) RETURNS VARCHAR(255)
BEGIN
-- 定义一个变量chars_str,有默认值
DECLARE chars_str VARCHAR(100) DEFAULT 'abcdefghijklmnopqrstuvwxyzABCDEFJHIJKLMNOPQRSTUVWXYZ';
DECLARE return_str VARCHAR(255) DEFAULT '';
DECLARE i INT DEFAULT 0;
-- 生成长度为n的随机字符串,存入return_str
WHILE i < n DOSET return_str = CONCAT(return_str, SUBSTRING(chars_str, FLOOR(1 + RAND() * 52), 1));SET i = i + 1;
END WHILE;
RETURN return_str;
END $$
3.2 产生随机数字
-- 随机产生from_num到to_num范围内的数
DELIMITER $$
CREATE FUNCTION rand_num(from_num INT, to_num INT) RETURNS INT(11)
BEGINDECLARE i INT DEFAULT 0;SET i = FLOOR(from_num + RAND() * (to_num - from_num +1));RETURN i;
END $$
如果要删除函数,使用下面的命令
drop function function_name;
4、创建存储过程
4.1 往emp表中插入数据的存储过程
DELIMITER $$
CREATE PROCEDURE insert_emp(START INT, max_num INT)
BEGIN
DECLARE i INT DEFAULT 0;
-- 把自动提交关闭
set autocommit = 0;
REPEAT
SET i = i +1;
INSERT INTO emp(empno, NAME, age, deptid) VALUES((START + i), rand_string(6), rand_num(30, 50), rand_num(1, 10000));
UNTIL i = max_num
END REPEAT;
COMMIT;
END $$-- 删除
DELIMITER ;
drop PROCEDURE insert_emp;
4.2 往dept表中插入数据的存储过程
DELIMITER $$
CREATE PROCEDURE insert_dept(max_num INT)
BEGIN
DECLARE i INT DEFAULT 0;
SET autocommit = 0;
REPEAT
SET i = i + 1;
INSERT INTO dept(deptname, address, ceo) VALUES(rand_string(8), rand_string(10), rand_num(1, 500000));
UNTIL i = max_num
END REPEAT;
COMMIT;
END $$-- 删除
DELIMITER ;
drop PROCEDURE insert_dept;
5、调用存储过程
5.1 添加数据到部门表
-- 执行存储过程,往dept表添加1w条数据
DELIMITER ;
CALL insert_dept(10000);
5.2 添加数据到员工表
-- 执行存储过程,往emp表添加200w条数据
DELIMITER ;
CALL insert_emp(100000, 2000000);
6、批量删除某个表上的所有索引
6.1 创建删除索引的存储过程
DELIMITER $$
CREATE PROCEDURE proc_drop_index(dbname VARCHAR(200), tablename VARCHAR(200))
BEGINDECLARE done INT DEFAULT 0;DECLARE ct INT DEFAULT 0;DECLARE _index VARCHAR(200) DEFAULT '';DECLARE _cur CURSOR FOR SELECT index_name FROM information_schema.STATISTICS WHERE table_schema = dbname AND table_name = tablename AND seq_in_index = 1 AND index_name <> 'PRIMARY';DECLARE CONTINUE HANDLER FOR NOT FOUND set done = 2;OPEN _cur;FETCH _cur INTO _index;WHILE _index <> '' DOSET @str = CONCAT("drop index ", _index, " on ", tablename);REPEAT sql_str FROM @str;EXECUTE sql_str;DEALLOCATE PREPARE sql_str;SET _index = '';FETCH _cur INTO _index;END WHILE;
CLOSE _cur;
END $$
6.2 执行存储过程
CALL proc_drop_index("dbname", "tablename");
MySQL批量插入测试数据相关推荐
- MYSQL批量插入数据库实现语句性能分析
MYSQL批量插入数据库实现语句性能分析 假定我们的表结构如下 代码如下 CREATE TABLE example ( example_id INT NOT NULL, name VARCHAR( ...
- mysql批量插入 增加参数_MySql 的批量操作,要加rewriteBatchedStatements参数
MySql 的批量操作,要加rewriteBatchedStatements参数 作者:赵磊 博客:http://elf8848.iteye.com ------------------------- ...
- mysql批量插入跟更新_Mysql批量插入和更新的性能-问答-阿里云开发者社区-阿里云...
利用Hibernate,连接池使用的是BoneCP,做了一个MySql批量插入和批量更新的Demo,出现了下面两个问题. 1.批量插入.我采用的是原生态的JDBC,每次批量插入60条数据左右(数据量不 ...
- Mysql批量插入数据问题解决和优化
Mysql批量插入数据问题解决和优化 一.问题描述 项目中mysql批量插入大概50000左右数据,使用事务和批量,但是速度依旧很慢,大约60s左右,迫切希望改进这个问题. 二.问题原因 尽管是批量a ...
- mysql 批量插入亿级数据做测试用
mysql 批量插入亿级数据做测试用 表结构: -- 性能提升 SELECT COUNT(*) from `user`.`user` ; SHOW VARIABLES; set session bu ...
- Mysql批量插入更新性能优化
Mysql批量插入更新性能优化 对于数据量较大的插入和更新,因io/cpu等性能瓶颈,会产生大量的时间消耗,目前主流的优化主要包括预编译.单条sql插入多条数据.事务插入等,下面详细介绍一下: 单条插 ...
- mysql批量插入跟更新_Mysql批量插入和更新的性能
利用Hibernate,连接池使用的是BoneCP,做了一个MySql批量插入和批量更新的Demo,出现了下面两个问题. 1.批量插入.我采用的是原生态的JDBC,每次批量插入60条数据左右(数据量不 ...
- PgSQL批量插入测试数据
PgSQL批量插入测试数据 1 pgsql批量插入测试数据测试 pgsql批量插入测试数据测试 1.1 测试准备 -- 1.创建测试表t_user create table if not exists ...
- node.js中mysql批量插入更新的三种方法
[背景]在项目中遇到一个批量插入数据的需求,由于之前写过的sql语句都是插入一个对象一条数据,于是去网上搜关键词 "sql批量插入"."mysql批量插入"等, ...
- Mysql 批量插入大量数据的两种方案以及优缺点(分别是 5W 条数据和 10W 条数据)
Mysql 批量插入(5W 条数据和 10W 条数据) 1.批量插入思路 一般是有两种不同的思路: 1.for 循环批量插入 2.生成一条 SQL 语句,比如 insert into user(id, ...
最新文章
- 用Python实现坦克大战游戏 | 干货贴
- 自然语言处理(NLP)之英文单词词性还原
- uboot环境变量-带分号的环境变量
- 科学解释超级计算机,超级计算机:彻底“改变”科学
- dhtmlxtree api中文
- K 个一组翻转链表Python解法
- Redis-相关概念记录
- php api查询开发,PHP开发API接口(注册、登录、查询用户信息)的实例代码
- python技巧——list comprehension vs map
- realtek audio console无法连接rpc服务_程序员修神之路设计一套RPC框架并非易事
- 蓝桥杯网站试题练习系统网站,想拿国奖就靠它
- 达梦数据库查询表结构
- 【天津SEO】长尾关键词挖掘的八种技巧
- 自动化测试框架基石工程
- 在React项目中引入字体文件并使用
- 如何解决仓库无线网络覆盖问题?
- 一组li或者div里面多个弹出层对应各自的内容
- 红米5 Android 8.0,红米 5 获得 Android 8.0 稳定版更新:修复大量问题
- 杰理AC692X学习-BLE与APP端发送与接收
- 耳机重装系统后服务器坏了,Win7重装后耳机没声音|重装系统后耳机没声音怎么办?...