MySQL性能优化是一个老生常谈的问题,无论是在实际工作中还是面试中,都不可避免遇到相应的场景,下面博主就总结一些能够帮助大家解决这个问题的小技巧。
SQL优化之前需要确认哪些SQL需要优化,这时就需要引起SQL性能分析工具,主要优化的是查询语句。
在进行SQL优化之前首先需要确认哪些SQL需要优化,这时就需要使用到SQL性能分析工具,平常工作业务中,主要优化的是查询语句。
SQL性能优化一般是针对查询语句,所以在定位是否需要优化之前,可以先确认表的更删查改的一个执行频率对比,如果是查询占主导地位,则可以一步排查。
MySQL支持客户端通过:show [session|global] status命令对服务器状态进行查询。
查看执行频率方式:
确认了SQL的执行频率,则需要通过慢查询日志进行进一步定位哪些SQL语句执行时间占用较长。
慢查询日志记录了所有执行时间超过指定参数(long_query_time,单位:秒,默认是10s)的所有SQL语句的日志。
默认情况下,慢查询日志是没有开启的,需要在MySQL的配置文件(linux下默认路径为:/etc/my.cnf)中配置如下指令:
执行结果示意图:
参数具体含义如下:
通过慢查询日志,我们可以定位到超过设置阈值的慢SQL,但是实际业务中,这并不能完全具有代表性,因为阈值是主观设置的,可能有大量执行时间低于阈值的SQL也存在问题,因此慢日志SQL并不能完全定位出所有的慢SQL,此时则需要借助新的工具: show profiles。
show profiles 能够让我们了解到SQL执行时时间都耗费到哪里了。 通过have_profiling参数,可以查看mysql是否支持该profile操作。
默认情况下,profiling是关闭的,可以同set指令开启session|global级别的profiling。
优化方案:
前面介绍的几种方式都是通过执行时间长短来判断SQL语句执行的性能好坏,但是这个相对来说是比较片面的,想要更全面地评判SQL语句好坏,则需要使用explain查看SQL的执行计划。
Explain或者DESC命令获取MySQL如何执行SELECT语句的信息,包括在SELECT语句过程中表如何连接和连接的顺序。
1、ID参数
select中的查询序号,表示的是查询中执行select子句或者是操作表的顺序(id相同,执行顺序从上往下,id不同,值越大,越先执行)
2、select_type参数
表示select查询类型,常见的有SIMPLE(简单表,即不使用表连接或者子查询)、primary(主查询,即外层查询)、UNION(UNION中的第二个或者后面的查询语句)、SUBQUERY(SELECT/WHERE之后包含了子查询)
3、type参数
表示连接/访问类型,性能由好到差的连接类型为:null、system、const、eq_ref、ref、range、index、all
在优化的时候,尽量将type往前优化,最差也要为index
4、possible_key参数: 显示在执行查询时,表中可能被使用到的索引,一个或者多个、
5、key参数: 在执行查询时,实际上会命中的索引
6、key_len参数: 表示使用到的索引的字节数,该值为索引字段最大可能长度,在不损失精确性的前提下,长度越短越好。
7、rows参数: MySQL认为必须要执行查询的行数,在innodb引擎表中,是一个估计值,可能并不总是准确的
8、ref参数: 哪些列或者常量被用作索引列上的值(如下图:图源网络,侵联删)
9、filtered参数: 表示查询返回的行数占总读取行数的百分比,值越大越好
10、extra参数: 额外的一些执行信息如排序
道理千遍,不如实践。性能优化更多的是结合理论的基础上进行亲自实践,这样才能够在众多的方式中找到符合的方式,希望本篇文章能够给大家一些启发
博主最近开源了一个名为“轮子之王”的项目,其中集成了开发中常用的各项功能(现已集成有:csv、excel、ftp、文件服务器等导入导出轮子),有兴趣的小伙伴可以通过下面的地址跳转看看,希望能够帮助大家提高开发效率。
Gitee地址: 轮子之王
Github地址: 轮子之王