优化从何入手?
如何进行性能调优?使得查询更快
调优步骤
观察服务状态,是否有不规则的延迟和卡顿,可以开启慢查询,explain执行计划,sql执行时间长短,优化sql。或者修改表结构。如果还是不行,就读写分离,分库分表。
查看系统参数
从下面每一个环节入手
客户端连接服务端,可以调整服务端最大连接参数。
客户端可以重复使用连接。mybatis自带连接,阿里的druid(默认8个,和机器是几核有关,为什么连接池越大不好,因为减少cpu切换),c3p0,从连接池获取
配置的优化
修改配置一般有专业的dba进行,不是开发人员关注的重点哦!!!
缓存服务,redis,架构层面,数据库集群方案,读写分离()
主从复制,如何实现?会有一个server层的binlog日志,进行数据主从复制
主从复制出现的延时时候到底是出现在哪里?
读写分离,如果主服务器写入,但是没有马上复制到从,
mysql默认是异步复制,
使用全同步,所有节点都同步,但是事务执行时间变长,
所以我们使用半同步复制,如果使用半同步复制,我们需要安装一个插件
主节点安装插件,从节点也需安装
GTID复制
事务分组编号到从服务上执行(解决中从复制延时问题)
大事务分解成小事务进行多次提交,解决延迟问题
如果单表数据大,单表压力大,性能差。我们可以进行分表操作(分库分表)
如果master宕机,挂了?
sql语句的执行情况记录,慢日志开启,需要开启慢日志,查看慢日志是否开启
那么一个sql语句执行时间多长我们才说他是慢日志呢?通过参数配置时间
long_query_time参数进行配置,超过这个时间,就是慢sql
sql语句慢是慢在哪里,通过explain进行查看
慢查询默认没有开启,调优时候打开就行。
sql超过时间就会进入慢查询日志。记录慢查询sql,定位到具体的查询语句,然后用explain,看执行计划。
删除log文件后mysqladmin -uroot -拍flush-logs slow重新生成日志
慢查询日志分析工具mysqldumpslow
查看sql执行成本,SHOW PROFILE
默认关闭,可以开启,show variables like 'profiling’查看状态,set profiling = ‘ON’ 开启
show profiles ; show profile
explain的使用
查看执行计划,没有真正执行语句,只是看下它的执行计划。
内连接,外连接
小表驱动大表
驱动表,被驱动表
内连接,查询优化器可以决定谁作为驱动表,谁作为被驱动表。都没有索引,小表作为驱动表
一个表有索引,有的作为被驱动表
先查询的表就是驱动表,优化器决定先查哪张表
索引嵌套循环连接,所以小表驱动大表,所以被驱动表上必须有索引,这样就先去找索引了,极大减少对内层匹配次数。被驱动表是主键索引,用不着回表了。索引主键索引最好
驱动表数据放到buffer,批量和非驱动表区匹配
8.0对算法进行优化,改成hash join
子查询执行效率不高,msql为内层查询语句的结果建立一个临时表,外层语句从临时表中查询记录,查询完后,再撤销临时表,这样会消耗过多的cpu和io资源,产生大量的慢查询
临时表不会存在索引,所以我们使用join代替子查询
索引下推是在存储引擎层使用索引过滤数据的优化方式
之前没有索引下推,第一个条件查询后不走索引了,现在第一个条件查询后,第二个条件还会过滤,而不是直接回表操作,这样减少回表
作用就是回表之前过滤数据,可以关闭开启
select count(1) count(*)
磁盘中真正存在的ib_logfile0,ib_logfile1,这两个就是redolog日志保存的文件,恢复数据从这两个文件去恢复。
undo更新数据之前记录数据