MySQL - 慢查询分析

223 阅读1分钟

什么是慢查询

慢查询日志分析是一种用来记录执行时间超过阈值后记录的功能,通常用来定位业务系统中存在的性能短板并对其进行有针对性的优化。

怎么启用慢查询日志分析


  • 查看慢查询日志启用状态

    mysql> show variables like 'slow_query_%';
    # 检查slow_query_log(启用慢查询日志)值是否为on或1
    # 检查slow_query_log_file(慢查询日志存储路径)值是否有设置
    
  • 启用方式 - 1 (适合临时定位调试)

    # 启用慢查询日志
    mysql> set global slow_query_log="on";
    mysql> set global slow_query_log_file="日志存储的位置,以.log格式存储";
    
    # 设置阈值
    mysql> set global long_query_time="阈值数值,以秒为单位";
    
  • 启用方式 - 2 (适合定期分析优化)

    [root@localhost ~] vi /etc/my.cnf
    # 添加或修改以下内容
    [mysqld]
    slow_query_log=on # 启用慢查询日志
    slow_query_log_file = /var/log/mysql/slow_mysql.log # 设置慢查询日志存储路径
    long_query_time = 2 # 单位:秒
    
    [root@localhost ~] systemctl restart mysql
    

怎么分析慢查询日志

  • 先创建一个测试表并插入一些数据

    -- 创建表
    CREATE TABLE slow_table (
        id INT AUTO_INCREMENT PRIMARY KEY,
        name VARCHAR(100),
        email VARCHAR(100)
    );
    
    -- 插入随机记录
    SET @counter = 0;
    
    INSERT INTO slow_table (name, email)
    SELECT 
        CONCAT('Name', @counter := @counter + 1),
        CONCAT('email', @counter, '@example.com')
    FROM
        information_schema.tables AS t1,
        information_schema.tables AS t2
    LIMIT 3000000;
    
    -- 确保 AUTO_INCREMENT 计数器正确设置
    ALTER TABLE slow_table AUTO_INCREMENT = 1;
    
  • 查询数据

    mysql> select * from slow_table;
    # 不出意外的话这样查起来肯定会很慢,如果觉得数据量不够的话可以在加点
    
  • 使用分析工具

    [root@localhost ~] mysqldumpslow -s c [slow_query_log_file设置的路径]
    # 然后你就会得到
    # Reading mysql slow query log from slow_file路径
    # Count: 1  Time=2.39s (2s)  Lock=0.00s (0s)  Rows=3750768.0 (3750768), root[root]@[127.0.0.1]
    # select * from slow_table