索引 - 构造测试数据

  • 作者: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;