开发俏皮话
【让我996不算啥,我只怕测试也996给我提bug!】
笔者瞩望
你好,无论我们在现实生活中是否相识,在InfoQ的世界里终会快乐相遇,在此提前预祝国庆节快乐,并且在属于我们的“1024”那天不在加班,早点回家陪陪老婆和孩子啊。
技术金字塔
本篇文章会按照自上而下以及自下而上的两种方向去“游览”【MySQL技术金字塔】,两个方向分别是从成本出发的(潜台词就是便宜越好,照顾公司成本哦!),本章内容,可能有点多,希望大家慢慢消化,实在不行来片“吗丁啉”,哈哈,开玩笑了!
技术梗概
主要技术分布为6大部分,如下图金子图所示:
研发成本角度
从软件的【研发成本】的角度而言:伴随着优化的方向,从金字塔顶部像金字塔底部的方向进行过度,伴随着高度越来越低,成本会越来越低,这个方向其实是非常考验技术人员与项目管理者的能力的,但是它确实,老板对象看到的,哈哈。
技术可行性和效果角度
从软件的【技术可行性和效果】的角度而言:伴随着优化的方向,从金字塔低部像金字塔顶部的方向进行过度,伴随着高度越来越高,成本会越来越高,耗费的财力和人力也会相对的有所降低,但是如果多花钱,老板肯定不愿意,比如,请一些行业大牛或者一些牛掰的服务器等,可以看出来正好与上面的方向相反。
总结一下,以上这两点的方针,遵循着研发成本的越来越低+效果方案越来越高,那么我们就划分出一个公式,作为系统服务调优方法论,我们就按照金字塔层面,进行自下而上进行调优!我们接下来就来按照这个方向进行分析。
调优白皮书
业务需求和业务架构
产品中单要支援,需求出装要全面。——王者荣耀之产品篇
调整一下合适的需求,其实是一个很不错的方案,所以如果可以从根本上去出发,进行调整需求是一个很有效果的方案哦!并且对一些不合理的需求说不!在做架构设计的时候,应该充分考虑业务实际场景,考虑好数据库的选项和引入一些其他的方案是非常重要的,例如NoSQL或者NewSQL等。所以,调整好一个一个系统架构是一个非常不错的方案。
- 尽量将请求拦截在系统上游传统业务系统之所以挂,请求都压倒了后端数据层,数据读写锁冲突严重,并发高响应慢,几乎所有请求都超时,流量虽大,下单成功的有效流量甚小。
- 读多写少的常用多使用缓存这是一个典型的读多写少的应用场景,非常适合使用缓存。
SQL技术调优
根据业务需求,不单纯的写好SQL语句,还要对SQL语句进行调优,使得其性能变得最佳化。
调优的思路
调优主要有三个部分组成:发现问题、分析问题和解决问题。
发现问题(慢SQL的优化和分析)
发现慢SQL以及查询日志
查询慢SQL的日志是MySQL内置的一个功能,可以记录执行时间超过我们配置阈值的SQL语句。
参数与默认值:
使用方式-修改MySQL服务配置
一般我们就设置“老三样”即可!
- 修改我们安装后的配置文件my.cnf,在[mysqld]段落中加入以上参数配置:
[mysqld] log_output='FILE,TABLE'; slow_query_log=ON // 代表开启慢sql参数进行开启 long_query_time=0.001 //查询时间(秒) 复制代码
- 之后进行重启服务
service mysqld restart 复制代码
使用方式-修改全局服务配置
set global log_output='TABLE,FILE'; set global slow_query_log = 'NO'; set long_query_time = 0.001; 复制代码
这种方式,不需要重启就可以生效,但是当服务器重启的时候,又会重新丢失配置。
以上的配置可以将慢查询SQL记录到mysql数据库中的slow_log表中以及对应的slow_sql的文件中去。
分析慢SQ的查询日志
查询slow_log表,当根据上面的设置,当log_output设置为TABLE的时候,就会将mysql的慢查询日志记录到mysql.slow_log表中去,我们可以采用select * from mysql.slow_log
去进行查询,可以根据此方面进行分析和统计sql的执行性能。
分析慢SQL日志文件
当log_output设置为FILE的时候,因为文件过大,不方便查看,所以可以采用专门的工具进行分析,这里主要介绍原生的mysqldumpslow工具进行分析,如下图所示:
mysqldumpslow --help:
使用案例:
- 如果要查询出返回结果行数最多的20条SQL:
mysqldumpslow -s r -t 20 /path/show.log 复制代码
- 根据查询时间进行排序,并且带有left join的20条SQL:
mysqldumpslow -s t -t -g "left join" /path/show.log 复制代码
当然还有其他相关的MySQL慢查询分析日志工具,例如mysql profiles或者pt-query-digest也可以专门进行分析。有兴趣的小伙伴可以搜搜看。
执行计划分析慢SQL
explain关键字进行执行慢SQL语句,进行指标分析:
案例分析
最简单的案例就是:
explain sql语句
id字段
它表示代表着语句SQL中每一个部分原子查询(维护)操作的标识单位,如果explain中的有多个id对应的数据项,那么切记一定要按照:倒叙进行执行,也就是说:
- 数字越大的,越先执行分析
- 数字编号相同,从上到下进行分析
select_type字段
查询类型,如下几组值: