性能优化背景

  咱们先不说cpu的频率,内存的大小(这个和索引一样重要,但不是本文讨论的内容),硬盘的寻道时间。想起mysql的调优,最起码的必须知道explain执行计划,慢sql日志,老旧的profile命令,新的performance_schema性能视图和information_schema中当前事务和内存占用信息的相关表,还有 show engine innodb status的诊断信息,以及某些metrix中的tps,qps,iops的指标。

  以上是为调优准备的一些工具,而数据库都会为高可用提供很多大大小小的功能,大的有:复制,组复制,分区,文件链接:即log日志与数据文件等可分别放置不同硬盘。小的有:计算列,为列计算hash,索引合并,索引下推,MRR,BKA,Loose Index 等算法,以及填充因子等。

  当然,没有视图索引和分布式分区视图,以及join仅仅只支持nested这是mysql的不足,而sql server join的算法支持三种,loop while hash,极大的改善join的速度。mysql自带提升性能的功能并不多

,其他的就是经验之谈,比如静态表,不要在子查询中使用函数,尽量将子查询变为join查询,非字符串和blob列永远比其他的数字或者时间列要慢,join |order by|group一定不要让其在硬盘生成临时表,当然这个和内存有关,窄表和宽表设计等,当然最后还是取决你的业务类型。

  优化入手有两种方法,一种是运行时的,即在运行的服务器上优化,一种是开发过程中。而无论哪种,performance_schema都会需要。

Performance_schema讲解

  性能视图是每个数据库中都会有的,sql server是dm_*开头的一系列内存表。而mysql就是performance_schema库中的各种表,先看入口的几个表:SELECT * FROM setup_timers; -- 计时定义表
select * from setup_actors; -- 那些用户需要收集信息
select * from Setup_objects; -- 那些对象需要收集信息,比如mysql表,
select * from setup_consumers; -- 那些仪器的分类需要收集
select * from setup_instruments; -- 收集仪器,每一个功能点都会有仪器的事件,开始和结束,然后开启那个仪器,就会收集那个仪器的数据

首先我们看开启performance_schema的开关:

show variables like 'performance_schema' -- 这是一个read only变量

如果为OFF,则需要在配置文件中开启。

那么下面就一个一个介绍这几个入口表。

  1 ,setup_actors表

    

  全部用户都可收集。

  2,Setup_objects

  

  那些对象可以收集,是table还是trigger等。至于关闭两个列控制,enabled和timed字段设置为No,这几个表都是如此。

  3  setup_consumers

  

  事件的分类,stages是步骤,一个语句在服务器执行的过程步骤,结果和profile一样,profile方式不推荐,因为后面会去掉。transaction是事务的事件收集等。

  4 setup_instruments 

  这个就是主要的事件监控仪器,如下:

  

  5 最后就是setup_timers,配合performance_timers定义那些仪器分类是的时间类型,如下:

CYCLE:cpu时钟,TIMER_FREQUENCY是一秒有多少,TIMER_RESOLUTION是每次增加多少,最后是多久获取一次这个时间。

利用performance_schema获取priofile数据

开启相关的instrument:

我们看上面 instrument分类表setup_consumers中的信息,关于stage的行都是NO,那么我们需要改为YES,同时一会需要拿statements监控表中的信息,所以也需要开启statements:

UPDATE setup_consumers SET ENABLED = 'YES'WHERE NAME LIKE '%stage%';
UPDATE setup_consumers SET ENABLED = 'YES'
WHERE NAME LIKE '%statements%';

然后把stage的instrument开启

UPDATE performance_schema.setup_instruments SET ENABLED = 'YES', TIMED = 'YES'WHERE NAME LIKE '%stage/%';   -- 开启所有执行步骤的监控
UPDATE performance_schema.setup_instruments SET ENABLED = 'YES', TIMED = 'YES'
WHERE NAME LIKE '%statement/%';

执行依据sql

 select * from quartz.TestOne

查询这条语句的queryid:

SELECT EVENT_ID, TRUNCATE(TIMER_WAIT/1000000000000,6) as Duration, SQL_TEXTFROM performance_schema.events_statements_history_long WHERE SQL_TEXT like '%quartz%';

那么id就是509

然后执行性能监控表:

SELECT event_name AS Stage, TRUNCATE(TIMER_WAIT/1000000000000,6) AS DurationFROM performance_schema.events_stages_history_long WHERE NESTING_EVENT_ID=509

内容和老版本的profile结果一样。

主要看下stage/sql/Sending data这一行,这一行是主要io相关的事件,一般情况下,sql慢了,而这一行数值比较大,那肯定硬盘读数据慢了或者有锁冲突。

那么就是用error log,有死锁,mysql会将死锁信息打入error日志,show engine innodb status只是全局的一些信息,如果要想看详细的再去监控对应的instrument。

而且目前mysql8多支持NOWAIT和skiplocked两个语句,用法还是select.. from 表明 for update/for nowait等,非常灵活的解决了死锁的处理方式,当然你也可以让其事务隔离级别为脏读级别

,但是并不能解决更多的业务类型,设置死锁超时也是一个可行的办法。

MySQL之性能优化解说相关推荐

  1. DBA很忙—MySQL的性能优化及自动化运维实践

    作者:王辰 来自:高效运维(ID:greatops) DBA的日常工作 首先,我们来看看DBA的具体工作,我觉得 DBA 真的很忙:备份和恢复.监控状态.集群搭建与扩容.数据迁移和高可用,这是我们 D ...

  2. MySQL数据库性能优化之一

    MySQL数据库性能优化需要考虑的几个方面: 1.sql语句及索引优化 2.数据库结构优化 3.系统配置优化 4.硬件优化 转载于:https://blog.51cto.com/davidlinux/ ...

  3. mysql 改表面_MySQL_解析MySQL数据库性能优化的六大技巧,数据库表表面上存在索引和防 - phpStudy...

    解析MySQL数据库性能优化的六大技巧 数据库表表面上存在索引和防错机制,然而一个简单的查询就会耗费很长时间.Web应用程序或许在开发环境中运行良好,但在产品环境中表现同样糟糕.如果你是个数据库管理员 ...

  4. 淘宝内部分享:MySQL MariaDB性能优化

     淘宝内部分享:MySQL & MariaDB性能优化 摘要:MySQL是目前使用最多的开源数据库,但是MySQL数据库的默认设置性能非常的差,必须进行不断的优化,而优化是一个复杂的任务, ...

  5. MySQL主从复制性能优化

    MySQL主从复制性能优化 MySQL的主从复制的基本原理是从库连接到主库,主库生成一个主库DUMP线程,该DUMP线程的主要任务是 一直挖掘binlog日志,然后发送到从库的IO线程,IO线程接收到 ...

  6. #周末课堂# 【Linux + JVM + Mysql高级性能优化班】(火热报名中~~~)

    Linux + JVM + Mysql高级性能优化课程 课程名称:      Linux + JVM + Mysql高级性能优化 QQ群:      243242580(小白.菜鸟勿进)跟Java.M ...

  7. MySQL 数据库性能优化之SQL优化

    2019独角兽企业重金招聘Python工程师标准>>> MySQL 数据库性能优化之SQL优化 发布时间: 2012 年 3 月 21 日  发布者: OurMySQL 来源:简朝阳 ...

  8. MySQL数据库性能优化的关键参数(转)

    我们在进行数据库管理和开发中经常会遇到性能问题,这就涉及到MySQL的性能优化.通过在网络上查找资料和笔者自己的尝试,我认为以下系统参数是比较关键的: 关键参数一:back_log 要求 MySQL ...

  9. MySQL数据库性能优化史诗级大总结

    点击上方蓝色字体,选择"设为星标" 回复"资源"获取更多资源 大数据技术与架构 点击右侧关注,大数据开发领域最强公众号! 大数据真好玩 点击右侧关注,大数据真好 ...

最新文章

  1. 利用Procdump+Mimikatz获取Windows帐户密码
  2. plotly基于dataframe数据绘制股票OHLC图
  3. 语义分割--Learning Object Interactions and Descriptions for Semantic Image Segmentation
  4. 微信小程序一些常见的坑
  5. unity3d Vector3.Lerp解析
  6. rust(63)-全局静态变量
  7. 解读:一种来自Facebook团队的大规模时间序列预测算法(附github链接)
  8. boost::date_time模块测试时间分辨率特征
  9. 开放下载!《DTS控制台入门一本通》
  10. UVA10561 Treblecross
  11. node.js详解Http服务器
  12. Spark精华问答 | 怎么运行Spark?
  13. distinct关键字
  14. leetcode - 516. 最长回文子序列
  15. 创建私有CA及其签署和吊销证书
  16. docker+elasticsearch的安装
  17. TemplateDoesNotExist 异常
  18. 基于百度地图实现Android定位功能实现(详解+教程)
  19. Servlet.service() for servlet SpringMVC threw exception ---- java.lang.NullPointerException
  20. INDEMIND带你玩转OpenCV4.0(一):DIS光流算法解析

热门文章

  1. 08函数的参数 进阶
  2. 线段树模板hdu 1754:I Hate It
  3. vim 粘贴代码格式
  4. ubuntu创建wifi热点plasma-nm
  5. zabbix的安装监控windows,linux操作流程
  6. 计算机数据库基础知识笔记,计算机基础及技巧(我的电脑笔记,适合新手!包含使用电脑最基本的知识及DOS、网络及数据库等。)...
  7. pydev集成mysql_【Python】Windows平台下Python、Pydev连接Mysql数据库
  8. redis分布式缓存(三)
  9. 自我引用(Self reference)
  10. 缓冲池Buffer Pool