起源
在公司优化SQL遇到一个索引的问题,晚上回家想继续验证,无奈没有较多数据的表,于是,想造一些随机的数据,用于验证。
于是
于是动手写。由于自己不是MySQL能手,写得也不好。最后,插入的速度也不快,我使用的是MySQL的InnoDB引擎,电脑跑了差不多一通宵才插入100W数据(为自己的程序汗颜)。虽然这样,我还是再次保留这份代码,以防下次要使用。嘿嘿。(插入时切换成MyISAM引擎,插入速度会快很多,插入完毕再切换回来)
这里开始,备份我的代码
需要插入数据的表:
create table `t_member` (
`id` int (11),
`member_no` varchar (36),
`user_name` varchar (384),
`register_date` datetime
);
生成随机数字的函数:
DELIMITER $$
USE `demo`$$
DROP FUNCTION IF EXISTS `f_rand_num`$$
CREATE DEFINER=`root`@`localhost` FUNCTION `f_rand_num`(
start_num BIGINT,
end_num BIGINT
) RETURNS bigint(20)
BEGIN
RETURN FLOOR(start_num + RAND() * (end_num - start_num + 1));
END$$
DELIMITER ;
生成随机N位字符串的函数:
DELIMITER $$
USE `demo`$$
DROP FUNCTION IF EXISTS `f_rand_str`$$
CREATE DEFINER=`root`@`localhost` FUNCTION `f_rand_str`(l INT) RETURNS varchar(256) CHARSET utf8
BEGIN
DECLARE chars_range varchar(128) DEFAULT 'abcdefghijklmnopqrstuvwxyz';
DECLARE random_str varchar(256) DEFAULT '';
DECLARE i INT DEFAULT 0;
WHILE i < l DO
SET random_str = concat(random_str, char(ascii('a') + f_rand_num(0, 25)));
SET i = i +1;
END WHILE;
RETURN random_str;
END$$
DELIMITER ;
插入数据的存储过程:
DELIMITER $$
USE `demo`$$
DROP PROCEDURE IF EXISTS `p_make_data`$$
CREATE DEFINER=`root`@`localhost` PROCEDURE `p_make_data`(l INT)
BEGIN
DECLARE i INT DEFAULT 0;
WHILE i < l DO
insert into `t_member` (`member_no`, `user_name`, `register_date`)
values(f_rand_num(100000000000, 999999999999), f_rand_str(8), '2016-08-01');
SET i = i + 1;
IF (i % 1000 = 0) THEN
select @i;
END IF;
END WHILE;
END$$
DELIMITER ;
附一些测试SQL:
-- 调用过程
call p_make_data(500000);
-- 一些测试SQL
select f_rand_num(100000000000, 999999999999);
select f_rand_str(8);
select ORD('97');
select substring('hello', 5, 1);
select ascii('a');
select char(97);
select 100 % 5;
select count(1) from t_member t order by t.`id` desc;
后来的话(非常重要哦!)
后来参考了一篇文章,它提及,转换为MyISAM引擎插入数据速度会快很多,插入完毕后再转换回来InnoDB引擎使用,另外文章中还提及了一些提高速度的小诀窍,大家可以去看:mysql快速保存插入大量数据一些方法总结。