MySQL搞个1000w数据玩玩

100w条数据 320MB 320s
1000w条数据 3.2G 3200s
【大约】

#创建部门表 手动改为自增id
create table dept(
id int UNSIGNED PRIMARY key,
deptno MEDIUMINT UNSIGNED not null default 0,
dname varchar(20) not null default "",
ioc varchar(13) not null default ""
)engine=innodb default charset=GBK;

#创建员工表 手动改自增id
create table emp2(
id int UNSIGNED PRIMARY key,
empno MEDIUMINT UNSIGNED not null default 0,
ename varchar(20) not null default "",
job varchar(9) not null default "",
mgr MEDIUMINT UNSIGNED not null default 0,
hiredate date not null,
sal decimal(7,2)not null,
comm decimal(7,2)not null,
deptno MEDIUMINT UNSIGNED not null default 0
)engine=innodb default charset=GBK;

#开了慢查询 记得开这个
show VARIABLES like'log_bin_trust_function_creators'; 
set GLOBAL log_bin_trust_function_creators=1;

#随机字符串a-z A-Z
DELIMITER $$
create function rand_string(n int) returns varchar(255)
begin
	declare chars_str varchar(100) default 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
	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()*52),1));
	set i=i+1;
	end while;
	return return_str;
end $$

#随机数
delimiter $$
create function rand_num() returns int(5)
begin
	declare i int default 0;
	set i=floor(100+rand()*10);
return i;
end $$

#结束符号改为$$
#创建存储过程 插入员工的
delimiter $$
create procedure insert_emp0(in start int(10), in max_num int(10) )
begin
declare i int default 0;
set autocommit=0;
repeat
set i=i+1;
insert into emp2(empno, ename, job, mgr, hiredate ,sal, comm,deptno) values((start+i), rand_string(6),'salesman',0001,CURRENT_DATE,2000,400,rand_num());

until i=max_num
end repeat;
commit;
end $$


#结束符号改为$$
#创建存储过程 插入部门的
delimiter $$
create procedure insert_dept1(in start int(10), in max_num int(10) )
begin
declare i int default 0;
set autocommit=0;
repeat
set i=i+1;
insert into dept(deptno, dname,ioc) values((start+i), rand_string(10), rand_string(8));
until i=max_num
end repeat;
commit;
end $$

#插入10个部门
call insert_dept1(1,10);

select * from dept 

#康康有多少条记录了
select count(*) from emp2;

#50w一次插入 一共20次
call insert_emp0(10000000,500000);

#
select * from emp2 where ename like 'A%';

测试开始:
这一句用了10s

select * from emp2 where ename like 'A%';

建一个单值索引吧,花了1分钟。


create index index_ename on emp2(ename);

create index index_ename on emp2(ename)
OK
时间: 57.663s

再来,结果都显示不了。感觉慢了?


试个别的


select * from emp2 where empno=100000; 

花了10s

create index eno_idx on emp2(empno)
OK
时间: 37.075s

秒出。。。0.02+
100倍以上的速度。
这才是我想要的结果


接下来康另一个例子:

select * from emp2 where empno<100000; 

没建索引前10s,建了索引0.4s 秒出。

索引前:
在这里插入图片描述

索引后:
在这里插入图片描述


再来一个ename的 等值查询:

select id from emp2 where ename='uBzTVU';

没有索引7s 有索引秒出,这次又是想要的索引了,可以。


甚至这条模糊查询都是秒出:select id from emp2 where ename like ‘uBzTV%’;


== 去查了查得了个结果,原因是like模糊查询的时候,如果关键字输入得比较符合则有效果,如果不太符合的话则无效甚至更糟糕==


去测试发现:

#这条 秒出
select id from emp2 where ename like 'uAB%';

#这条则有问题
select id from emp2 where ename like 'A%';

#然后再缩减一个字母B看看结果,30s,更慢了
select id from emp2 where ename like 'uA%';


因此得到一个结论:

模糊查询的时候的关键词跟属性的长度有关,越多越好。过少会导致索引失效。

最好使用等值查询吧,暂时没发现有问题。


慢查询日志开启:

默认关闭,没有文件
开启后会创建一个.log文件

#显示两个变量,一个是是否开启,另一个是文件存储的位置
show  VARIABLES like '%slow_query_log%';

set GLOBAL slow_query_log=1;

show  GLOBAL VARIABLES like '%slow_query_log%';

看定义的长的时间(默认10s),并修改为3s ,然后开始查询康康

show  VARIABLES like '%long_query_time%';

set long_query_time=3;

create index ino on emp2(empno);

select * from emp2 where empno<100000;

select * from emp2 where ename like 'abdc%';

结果都是理想的,该被记录就被记录进去了

猜你喜欢

转载自blog.csdn.net/BOWWOB/article/details/113801434
今日推荐