索引 - 构造测试数据 ¶
作者:KK
发表日期:2017.3.23
为嘛要学习构造数据? ¶
由于数据量少的时候,有没有索引的查询差异根本没啥区别
所以为了更好地测试索引的效果,我们需要学会快速地构造大量的数据,虽然不是很真实的数据,但或多或少能对试验起到不错的效果
先定义一个随机字符串的函数 ¶
先use一个测试数据库(比如test库),把以下代码复制后直接粘贴到mysql命令行中执行
DROP FUNCTION if exists rand_string;
delimiter //
CREATE DEFINER=`root`@`localhost` FUNCTION `rand_string`(n INT) RETURNS varchar(255) CHARSET utf8
BEGIN
DECLARE chars_str varchar(100) DEFAULT 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
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()*62 ),1));
SET i = i +1;
END WHILE;
RETURN return_str;
END;//
delimiter ;
select rand_string(5);
最后光标在select rand_string(5);
这一行,再按一次回车其实就是执行查询,就应该会返回一个5位长度的随机字符串
于是我们就成功创建了一个rand_string
函数(只属于这个数据库,use其它数据库没有这个函数),以后测试完毕如果要删除这个函数请执行DROP FUNCTION rand_string;
准备构造数据,但还需要一个储存过程 ¶
再复制以下代码粘贴执行,会创建一个叫做mockData
的储存过程(重复执行都可以)
delimiter //
DROP PROCEDURE IF EXISTS mockData//
CREATE PROCEDURE mockData (IN rowCount int)
BEGIN
DECLARE insertCount int;
SET insertCount = 0;
DROP TABLE IF EXISTS `user`; /*删掉之前创建的表,因为下面要建这个名字的表*/
/*自己按需求修改以下建表语句构造需要的表*/
CREATE TABLE `user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(20) NOT NULL,
`age` tinyint(3) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;
START TRANSACTION;
loopHandler : LOOP
/*插入数据*/
INSERT INTO `user`(`name`,`age`) VALUES( rand_string(20), CEIL(RAND() * 110) );
SET insertCount = insertCount + 1;
IF (insertCount >= rowCount) THEN
LEAVE loopHandler;
END IF;
END LOOP loopHandler;
COMMIT;
END
//
delimiter ;
SELECT NOW();
然后执行call mockData(100000);
就会创建一个user表,里面有100000条记录的(等待约10~20秒,看你机器情况了)
就像编程语言调用函数一样而已,参数就是要模拟数据的行数,重复执行的话会删除之前创建表表然后才创建新表
上面的储存过程代码中大家可以看到CREATE TABLE
建表语句和INSERT INTO
插数据语句,后面自己按需求修改里面的字段吧
- 提示:测试完毕如果要删除这个储存过程请执行
DROP PROCEDURE mockData;