详细聊聊MySQL中慢SQL优化的方向

目录
  • sql语句优化
    • 记录慢查询sql
    • 查看sql执行计划
    • sql编写优化
    • 为何要对慢sql进行治理

        前言

        影响一个系统的运行速度的原因有很多,是多方面的,甚至可能是偶然性的,或前端,或后端,或数据库,或中间件,或服务器,或网络等等等等,真正的去定位一个问题需要对系统有一定的认知,可以根据自身的判断去缩小问题范围。

        今天不说其他的优化,单独把数据库的优化拿出来说几个优化方向。

        跟系统的优化方向一样,数据库的优化,同样也是多方面的,其中涵盖着sql语句的执行情况,数据库自身的情况等等,下面我们就来说一下mysql数据库中的慢sql语句优化方向,希望也能给到大家一些优化思路。

        sql语句优化

        sql语句的优化,有很多文章说起,也有很多在sql编写上的指导;但是那种只能支持基本开发,如果要排查问题,那就不能单单的只是停留在sql编写上了,而是有一个整体的发现问题的流程。

        本次优化方向,大概分为发现慢查询sql,查看并解析sql执行计划,sql编写上的优化,索引优化等几个方面。

        记录慢查询sql

        mysql中记录慢查询sql是可以利用mysql内部配置来实现的,这个配置就是slow_query_log配置。

        可利用show variables like ‘%query%’;查询出以下三个相关结果。

        long_query_time     | 1.00000
        slow_query_log      | off
        slow_query_log_file | /data/mysql/mysql_slow.log
        

        解释一下这三个参数,

        • long_query_time:如何区分sql查询是慢查询,就要规定一个查询时间,超过这个时间的就归类于慢查询,此参数就是来设置时间范围的;以秒为单位,可以设置小数。
        • slow_query_log:此参数为是否开启记录慢查询sql的开关,两个选择,on或者off,默认为off,所以在这里我们就知道如果要开启慢查询sql记录,需要手动设置开启。
        • slow_query_log_file:慢查询sql日志的文件路径,可以自行指定。

        如何修改配置

        有两个方法。

        其一:修改my.ini或者是my.cnf文件,将此三项配置进行一个配置。

        其二:直接在sqlplus中,使用set语法来修改参数,但是重启mysql数据库后就会失效,sql如下:

        set global long_query_time = 10;
        
        set global slow_query_log = on;
        
        set global slow_query_log_file = /data/mysql/mysql_slow.log;
        

        因为这个方法会重启失效,所以还是建议使用第一种方式。

        查看慢查询日志

        如何查询慢查询日志呢,如果量很小的情况下,其实是不需要使用工具的,完全可以直接打开即可。

        如果量比较大,就需要mysqldumpslow工具查询会更方便。

        mysqldumpslow是和mysqld相同类型的执行脚本,可以直接在命令行中执行,具体的使用方法如下:

        mysqldumpslow参数:

        -s,是order的顺序
        —–al 平均锁定时间
        —–ar 平均返回记录时间
        —–at 平均查询时间(默认)
        —–c 计数
        —–l 锁定时间
        —–r 返回记录
        —–t 查询时间

        -t,top,即为返回前面多少条的数据
        -g,自定义正则表达式

        举个例子,如下:

        mysqldumpslow -s r -t 5 /data/mysql/mysql_slow.log

        查询出返回记录集最多的5个慢查询sql。

        更多用法之后我建个测试库单独写篇文章细说一下。

        查看sql执行计划

        查看执行计划关键词:explain

        如何使用

        就是直接执行 explain select * from table_name;

        这个一开始我是打算简单说一下的,后来发现篇幅太长了,这个留待下篇文章里,感谢理解。

        sql编写优化

        sql的编写优化就很多了,我这里也整理出了一些,请大家自行查漏补缺。

        • 查询语句无论是使用哪种判断条件 等于、小于、大于, where左侧的条件查询字段不要使用函数或者表达式。
        • 不要直接使用select *,而应该使用具体需要查询的表字段;select * 使用的是全表扫描,不会走索引的。
        • 避免在 where 字句中对字段进行 null 判断。
        • 避免在 where 中使用 != 或 <> 操作符。
        • 使 用 between and 替代 in。
        • 为常用搜索条件创建索引
        • 选择正确的存储引擎, innodb 、myisam 、memory 等,不同的场景下使用不同的存储引擎会有更好的效果。
        • 使用 like %123% 不会走索引, 而使用 like 123% 会走索引。非常重要!!!
        • 选择合适的字段类型。
        • 设计字段时,要尽量使用not null。

        为何要对慢sql进行治理

        从数据库角度看:每个sql执行都需要消耗一定i/o资源,sql执行的快慢,决定资源被占用时间的长短。假设总资源是100,有一条慢sql占用了30的资源共计1分钟。那么在这1分钟时间内,其他sql能够分配的资源总量就是70,如此循环,当资源分配完的时候,所有新的sql执行将会排队等待。

        从应用的角度看:sql执行时间长意味着等待,在oltp应用当中,用户的体验较差

        治理的优先级上

        • master数据库->slave数据库
          • 目前数据库基本上都是读写分离架构,读在从库(slave)上执行,写在主库(master)上执行。
          • 由于从库的数据都是从主库上复制过去的,主库等待较多的,会加大与从库的复制时延。
        • 执行次数多的sql优先治理
        • 如果有一类sql高并发集中访问某一张表,应当优先治理。

        总结

        这里面远远还没有讲全,还有很多种编写规则,同时还有索引的建立并没有聊,留给大家一些自己看书的时间,希望大家有所进步。

        到此这篇关于mysql中慢sql优化方向的文章就介绍到这了,更多相关mysql慢sql优化方向内容请搜索www.887551.com以前的文章或继续浏览下面的相关文章希望大家以后多多支持www.887551.com!

        (0)
        上一篇 2022年3月21日
        下一篇 2022年3月21日

        相关推荐