起源
在公司優化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快速保存插入大量數據一些方法總結。