• Mysql的语句执行很慢,如何分析排查?


    1、检查服务器性能是否存在瓶颈

    如果系统资源使用率比较高,比如CPU,硬盘,那访问肯定会慢,如果你发现是Mysl占比比较高,说明Mysql的读写频率高,如果本身网站访问量不大,说明你的sql参数,sql语句查询慢导致

    df -h:终端中输入命令,将显示系统中每个分区的磁盘使用情况,包括已使用、可用和总容量。

     top :终端输入top 命令,每个进程的信息包括进程 ID(PID)、用户、CPU 使用率、内存使用率、进程名称等。你可以根据需要查看更多详细信息,例如进程的命令行参数、线程数等。

    2、优化SQL参数

    1. max_connections:表示MySQL服务器可以同时处理的最大连接数。默认值为151,可以根据实际需求进行调整。
    2. wait_timeout:表示一个空闲连接在被断开之前可以保持多长时间。默认值为28800秒(8小时),可以根据实际需求进行适当调整。
    3. interactive_timeout:表示一个交互式连接在被断开之前可以保持多长时间。默认值为28800秒(8小时),可以根据实际需求进行适当调整。

    (1)# 打开MySQL的配置文件 

    sudo vi /etc/mysql/my.cnf

    (2)编辑my.cnf文件,在[mysqld]部分添加以下内容:

          max_connections = 200
          wait_timeout = 600
          interactive_timeout = 600

          log-queries-not-using-indexes = on 

    1. max_connections:表示MySQL服务器可以同时处理的最大连接数。默认值为151,可以根据实际需求进行调整。
    2. wait_timeout:表示一个空闲连接在被断开之前可以保持多长时间。默认值为28800秒(8小时),可以根据实际需求进行适当调整。
    3. interactive_timeout:表示一个交互式连接在被断开之前可以保持多长时间。默认值为28800秒(8小时),可以根据实际需求进行适当调整。
    4. log-queries-not-using-indexes = on :记录未使用索引的查询

    (3) 保存文件并重启MySQL服务

    sudo service mysql restart

    3、开启query相关变量,进行慢查询记录 

     show variables like '%query%';查看query相关变量

    开启慢查询日志,此时OFF已经被我们用命令改为on了。

     4、慢查询语句

    当我们执行一条SQL语句进行查询的话,如果执行时间超出了我们刚才设备的阈值10秒就会被记录日志文件中,定义为慢查询语句

     进入到记录的慢查询日志文件中,我们可以使用慢日志分析工具—mysqldumpslow对记录的sql语句进行筛选,(安装教程自己百度一下即可) 还有一个工具mysqlsla 分析慢查询日志(安装百度搜一下)

    执行命令:

    [root@chances126 /]# mysqldumpslow   /var/lib/mysql/mysql-slow.log
    

    显示最慢的10条查询:mysqldumpslow -t 10 /path/to/slow-query.log

    代表按照SQL执行时间,返回slowlog中前4条慢:mysqldumpslow -a -s t -t 4 -v /var/lib/mysql-slow.log,如下内容显示:

    5、根据筛选出来的慢查询语句使用explain进行分析优化

    1. [root@chances126 /]#
    2. mysql> use sc_epg_release4
    3. Reading table information for completion of table and column names
    4. You can turn off this feature to get a quicker startup with -A
    5. Database changed
    6. mysql> EXPLAIN select distinct a.* from EPG_CONTENT_SERIES a join EPG_CATEGORY_ITEM b on a.CONTENT_CODE = b.ITEM_CODE where a.ENABLE_STATUS=1 and b.STATUS=0 and a.EXTERNAL_CODE = '2000000200000010042000000006088';
    7. +----+-------------+-------+------+---------------+-------------+---------+-----------------------------+-------+------------------------------+
    8. | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
    9. +----+-------------+-------+------+---------------+-------------+---------+-----------------------------+-------+------------------------------+
    10. | 1 | SIMPLE | b | ALL | NULL | NULL | NULL | NULL | 28504 | Using where; Using temporary |
    11. | 1 | SIMPLE | a | ref | seriesIndex | seriesIndex | 387 | sc_epg_release4.b.ITEM_CODE | 1 | Using where |
    12. +----+-------------+-------+------+---------------+-------------+---------+-----------------------------+-------+------------------------------+
    13. 2 rows in set (0.00 sec)
    14. mysql>

    可以看出 a 表是全表查询,b表级别是 ref ,可以进一步分析 sql 了。
    性能从最好到最差:system、const、eq_reg、ref、range、index和ALL. 

  • 相关阅读:
    为何内存不够用?微服务改造启动多个Spring Boot的陷阱与解决方案
    微服务原理
    电商商城管理系统
    Jenkins 下载安装
    必知必会,7 张图轻松理解 K8S 集群内服务通信
    算法金 | 必会的机器学习评估指标
    .NET8.0 AOT 经验分享 - 专项测试各大 ORM 是否支持
    Java版本spring cloud + spring boot企业电子招投标系统源代码
    AI大语言模型时代构建全新数据平台
    粒子群算法和鲸鱼算法的比较(Matlab代码实现)
  • 原文地址:https://blog.csdn.net/weixin_43942414/article/details/140388759