首先来创建一张表:

create table large_table(
	`uid` bigint unsigned auto_increment,
	`username` varchar(30) not null,
	`password` varchar(100) not null,
	`email` varchar(50) not null,
	`reg_time` datetime not null default CURRENT_TIMESTAMP,
	primary key(`uid`)
)engine=innodb default charset=utf8;

然后,创建一个生成单位随机字符串的存储函数:

delimiter $$
create function getRandomSingleCharacter() returns varchar(1)
begin
    return substring('abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789', rand()*62+1, 1);
end$$
delimiter ;

以前用得少,临阵磨枪,这里可能让高手笑话了,再创建一个生成自定义长度的随机字符串的存储函数:

delimiter $$
create function getRandomString(number int) returns text
begin
	declare result text;
	declare i int;
	declare str varchar(1);
	set i = number;
	set result = '';
	while length(result) < i do
	set str = getRandomSingleCharacter();
	set result = concat(result,str);
	end while;
	return result;
end$$
delimiter ;

最后,创建一个批量插入的存储过程:

delimiter $$
create procedure batchInsertLargeTable(number bigint)
begin
		declare totalNumber bigint;
		declare i int;
		declare username text;
		declare passwd text;
		declare email text;
		set i = 1;
		set totalNumber = number;
		while i <= totalNumber do
		set username = getRandomString(6);
		set passwd = md5(getRandomString(6));
		set email = concat(getRandomString(6),'@gmail.com');
		insert into large_table (username,password,email) values (username,passwd,email);
		set i = i+1;
		end while;
end$$
delimiter ;

开始插入数据,调用存储函数,并传入需要插入的记录数量:

call batchInsertLargeTable(8000000);

我的机器配置有限,差不多每100W条数据平均花半个小时,本demo记录的是博主在阅读Mysql官方文档的优化部分时,实验环境的需要。

额外记录一下,mysql由于存储引擎的不同,可能在实时查看插入了多少条数据的时候一般使用count(*)之类的,在Myisam引擎下,表的数据行是写于表信息里面的,所以对一个Myisam引擎的数据表执行select count(*) from table_name 速度非常快。在现在5.5以上的版本,默认是innodb,对与count(*)并不是非常理想,就算是使用了主键索引,可以给主键列额外加上一个普通或唯一索引,性能会有所提升的。