MySQL慢查询日志实战演示

46 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第4天,点击查看活动详情

前言

上篇我们学习了MySQL中的数据库优化之慢查询日志。有兴趣的小伙伴可以阅读(MySQL慢查询日志)。
下面我们继续学习MySQL中的数据库优化之慢查询日志实战演示。

实战演示

  1. 创建表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;
  1. 创建一个随机产生字符串数据的函数,方便添加数据。创建函数:
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 ;
  1. 创建一个随机产生随机数值的函数,方便添加数据。创建函数:
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 ;
  1. 创建存储过程
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 ;
  1. 调用存储过程,造测试数据,
CALL insert_stu(100001, 4000000);
  1. 查询数据
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,返回访问次数最多的记录等,从而针对特定问题进行优化。

今天先学习到这里,明天继续。