DROP TABLE IF EXISTS `testemployee`;
CREATE TABLE `testemployee` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(20) DEFAULT NULL,
`dep_id` int(11) DEFAULT NULL,
`age` int(11) DEFAULT NULL,
`salary` decimal(10,2) DEFAULT NULL,
`cus_id` int(11) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=109 DEFAULT CHARSET=utf8;
set global log_bin_trust_function_creators=TRUE
批量拆入sql
delimiter $$
create procedure insert_emp(in max_num int)
BEGIN
declare i int default 0;
set autocommit = 0;
repeat
set i = i + 1;
insert into testemployee (name,dep_id,age,salary,cus_id) values(rand_str(5),floor(1 + rand()*10),floor(20 + rand()*10),floor(2000 + rand()*10),floor(1 + rand()*10));
until i = max_num
end REPEAT;
commit;
end $$
delimiter ;
随机生成字符串
#随机生成一个指定个数的字符串
delimiter $$
create function rand_str(n int) RETURNS VARCHAR(255)
BEGIN
#声明一个str 包含52个字母
DECLARE str VARCHAR(100) DEFAULT 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
#记录当前是第几个
DECLARE i int DEFAULT 0;
#生成的结果
DECLARE res_str varchar(255) default '';
while i < n do
set res_str = CONCAT(res_str,substr(str,floor(1+RAND()*52),1));
set i = i + 1;
end while;
RETURN res_str;
end $$
delimiter ;
使用存储过程,构造100万条数据;
使用传统的分页,假设当前表中有100万条数据,不同页的分页结果如下:
原因:
使用limit随着offset增大,查询的速度会越来越慢,
会把前面的数据都取出,找到对应的位置
使用子查询优化,让最耗时的操作走索引
直接查:0.873s
第一种优化:0.633s
第二种优化:0.620s
使用id限定优化:传入上一页的最大值
时间:0.01s
EXPLAIN SELECT MAX(AGE) FROM employee
CREATE INDEX index_age ON employee (age)
添加索引后,没有真正的去查表,而是使用优化器的统计信息
EXPLAIN UPDATE employee set name = '张三' where id = 1
CREATE INDEX index_name_age on employee (name,age)
EXPLAIN UPDATE employee set name = '张三' where name = '鲁班' and age = 15
EXPLAIN UPDATE employee set name = '张三' where age = 15
update set name = 'aaa' where id > 3 and id < 7
update set name = 'bbb' where id = 5;
查看行锁的状态,最大的等待时长是多少
show status like 'innodb_row_lock%';