开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第4天,点击查看活动详情
前言
上篇我们学习了MySQL中的数据库优化之慢查询日志。有兴趣的小伙伴可以阅读(MySQL慢查询日志)。
下面我们继续学习MySQL中的数据库优化之慢查询日志实战演示。
实战演示
- 创建表student
CREATE TABLE student (
id INT(11) NOT NULL AUTO_INCREMENT,
stuno INT NOT NULL,
name VARCHAR(20) DEFAULT NULL,
age INT(3) DEFAULT NULL,
classId INT(11) DEFAULT NULL,
PRIMARY KEY (id)
) ENGINE = INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
- 创建一个随机产生字符串数据的函数,方便添加数据。创建函数:
DELIMITER //
CREATE FUNCTION rand_string(n INT)
RETURNS VARCHAR(255) #返回字符串
BEGIN
DECLARE chars_str VARCHAR(100) DEFAULT
'abcdefghijklmnopqistuvwxyzABCDEFGHIJKLMNOPQISTUVWXYZ';
DECLARE return_str VARCHAR(255) DEFAULT '';
DECLARE i INT DEFAULT 0;
WHILE i < 0 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 ;
- 创建一个随机产生随机数值的函数,方便添加数据。创建函数:
DELIMITER //
CREATE FUNCTION rand_num (from_num INT, to_num INT)
RETURNS INT(11)
BEGIN
DECLARE i INT DEFAULT 0;
SET i = FLOOR(from_num + RABD() * (to_num - from_num + 1));
RETURN i;
END //
DELIMITER ;
- 创建存储过程
DELIMITER //
CREATE PROCEDURE insert_stu(START INT, max_num INT)
BEGIN
DECLARE i INT DEFAULT 0;
SET autocommit = 0;
REPEAT
SET i = i + 1;
INSERT INTO student (stuno, name, age, classid) VALUES
((START + i), rand_string(6), rand_num(10, 100), rand_num(10 ,1000));
UNTIL i = max_num
END REPEAT;
COMMIT;
END //
DELIMITER ;
- 调用存储过程,造测试数据,
CALL insert_stu(100001, 4000000);
- 查询数据
SELECT *
FROM student
WHERE stuno = 5002344;
SELECT *
FROM student
WHERE name = 'sudhsQ';
运行上面两条语句,从结果中可以看到花费时间已经达到了秒级,说明目前的查询效率是比较低的。使用上一节的mysqldumpslow查看慢查询日志。
比如我们想要查询时间排序,查看前2条SQL语句,语法如下:
mysqldumpslow -s t -t 2 /mysql/slow.log
通过查询日志,我们可以找到使用时间最长的2条记录,从而针对找出的问题进行对应的优化。
同时使用慢查询日志,还可以查看其他想要查找的记录,比如返回记录集最多的sql,返回访问次数最多的记录等,从而针对特定问题进行优化。
今天先学习到这里,明天继续。