[MySQL学习] MySQL 5.6 improvement for troubleshooting

简介:

本文基于Sveta(Oracle的Principle Technical Support Engineer )的博文”My eighteen MySQL 5.6 favorite troubleshooting improvements”,原文地址如下:https://blogs.oracle.com/svetasmirnova/entry/my_18_mysql_5_6

原文针对每个点介绍的比较粗略,这里会对内容做一些扩展,也是我看这篇博客时的笔记,聚合了查阅的相关资料

 

1.对UPDATE/INSERT/DELETE进行EXPLAIN

在5.5及之前的版本中,只能对SELECT进行explain,输出查询计划,通常的做法是将DML转换为SELECT,但优化器在对DML和查询,可能做不同的优化。

 

简单的测试表sbtest,例如:

mysql> explain delete from sbtest1 where k = 100;

+—-+————-+———+——-+—————+——+———+——+——+————-+

| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |

+—-+————-+———+——-+—————+——+———+——+——+————-+

| 1 | SIMPLE | sbtest1 | range | PRIMARY,k | k | 4 | NULL | 1 | Using where |

+—-+————-+———+——-+—————+——+———+——+——+————-+

1 row in set (0.00 sec)

 

不过尝试了下,explain extended对于DML不记录warning,而对于SELECT,可以从warning中查看到具体的查询计划信息     

 

2. INFORMATION_SCHEMA.OPTIMIZER_TRACE表(后续扩展研究)

这是5.6新增的表,用于记录最近的几次查询计划数,比起5.5,这其中记录的信息更加具体,不过也复杂很多,不是很好读懂,官方提供的文档在此:

http://dev.mysql.com/doc/internals/en/optimizer-tracing.html

表结构如下:

Query 查询的SQL
TRACE 查询计划路径,格式为json
MISSING_BYTES_BEYOND_MAX_MEM_SIZE 由于超出optimizer_trace_max_mem_size限制,导致的截断字节数
INSUFFICIENT_PRIVILEGES 某些情况下,用户执行的SQL引用了SQL SECURITY DEFINER试图或者存储过程,可能在某些对象上没有权限,将trace置为空,并将该列设置为1

 

每个线程单独保存各自的查询路径数据,从这个表中也只能获得各自的数据。

 

默认情况下,这个特性是关闭的,我们可以通过如下打开:

SET optimizer_trace=”enabled=on”;

 

optimizer_trace有两个字段:

“enabled=on,one_line=off” ,可以通过set 进行字符串更新,前者表示打开optimizer_trace,后者表示打印的查询计划是否以一行显示,还是以json树的形式显示

 

我们可以在session级别来设这这个参数。

 

默认optimizer_trace_limit值为1,因此只会保存一条记录。这个设置需要重连session才能生效,另外一个变量optimizer_trace_offset通常与之配合使用,默认值为-1

例如,offset=-1, limit=1将显示最近一次trace

offset=-2,limit=1将显示最近的前一个trace。

offset=-5,limit=5 将最近的5次trace打印出来

 

总的来说:

当offset大于0时,则会显示老的从offset开始的limit个trace,也就是说,新的trace没有记下来。

当offset小于0时,则会显示最新的-offset开始的limit个trace,也就是说,只显示新的trace

 

注意重设变量会导致trace被清空

另外由于trace数据是存储在内存中的,因此还需要设置optimizer_trace_max_mem_size来限制内存的使用量,否则意外的设置可能导致内存爆掉。这是session级别,不应该设置的过大

 

optimizer_trace_limit和optimizer_trace_offset也影响占用内存大小,但不应该超过OPTIMIZER_TRACE_MAX_MEM_SIZE

 

另外,还有个参数optimizer_trace_features,可以控制打印到查询计划树的项,暂不展开描述

 

从optimizer_trace表打印的信息来看,即使是一条简单的select语句,也会打印出非常庞大的树形结构,通过set @@end_markers_in_json=ON可以使其更便于阅读。

 

官方示例

 

 

针对OPTIMIZER_TRACE的开销,DimitriK大神有做过测试,链接如下:

http://dimitrik.free.fr/blog/archives/2012/01/mysql-performance-overhead-of-optimizer-tracing-in-mysql-56.html

根据其测试,当打开optimizer trace时,约有不到10%的性能下降,打开innodb_stats_persistent时,几乎没有退化(未去证实)

 

3.以JSON模式输出explain

执行格式为 EXPLAIN FORMAT=JSON [query]

 

示例1示例2

 

4.更多的information_schema表

 

INNODB_METRICS表包含了很多跟Innodb相关的计数器,包含相当多可以用于诊断的信息,目前约有207个计数器(MySQL5.6.9)

通过选项innodb_monitor_enable、innodb_monitor_disable、innodb_monitor_reset来调整每个计数器,例如想开启某个计数器,就执行

set global innodb_monitor_enable = “dml_%”  //可以用匹配符来做计数器名

也可以直接用”%”来代替所有的计数器

set global innodb_monitor_reset_all = ‘%';

 

INNODB_SYS_%包含了Innodb数据词典等信息,例如表,外键,列等。。。

mysql> show tables like ‘INNODB_SYS_%';

+———————————————+

| Tables_in_information_schema (INNODB_SYS_%) |

+———————————————+

| INNODB_SYS_DATAFILES |

| INNODB_SYS_TABLESTATS |

| INNODB_SYS_INDEXES |

| INNODB_SYS_TABLES |

| INNODB_SYS_FIELDS |

| INNODB_SYS_TABLESPACES |

| INNODB_SYS_FOREIGN_COLS |

| INNODB_SYS_COLUMNS |

| INNODB_SYS_FOREIGN |

+———————————————+

 

 

INNODB_BUFFER_POOL_STATS包含了每个buffer pool实例的信息。

 

另外还有其他,例如更多的压缩表信息展示。。。。

 

 

5.将所有的死锁信息全写入错误日志中

控制选项:innodb_print_all_deadlocks

 

 

6.物化Innodb表的统计信息

控制选项:innodb_stats_persistent

当开启该选项后,就会将表的统计信息记录到ibdata中,只有手动执行ANALYZE TABLE才会对其进行更新。

 

 

7. Innodb只读事务(需要跟进)

官方博客介绍

默认开启事务是READ WRITE,可以在开启事务时指定: START TRANSACTION READ ONLY;

如果以autocommit运行select,则视其为READ ONLY

根据官方描述,只读事务减少了创建read view的开销,因为这是个全局锁竞争的热点。

后面再深入研究其具体实现。

 

 

8.支持buffer pool数据转储,这可以减少重启预热bP的时间,Percona5.5就已经支持了,不过用的很少

有两个参数来控制这个行为:

 

转储文件名为ib_buffer_pool, 转储的文件中只记录了space id和page no,这些信息从 innodb_buffer_page_lru中获得

 

设置参数innodb_buffer_pool_dump_now 为ON ,可以立刻开始一次转储

还有一个参数innodb_buffer_pool_dump_at_shutdown 用于控制在shutdown时转储

 

相应的也有两个参数来控制将转储文件中记录的page读入bp

innodb_buffer_pool_load_now

innodb_buffer_pool_load_at_startup

可以通过innodb_buffer_pool_filename来指定转储和导入的文件名,默认文件名为ib_buffer_pool

也可以通过参数 innodb_buffer_pool_load_abort来中断load page的过程

 

Innodb_buffer_pool_dump_status上次转储时间点

Innodb_buffer_pool_load_status上次导入Page的时间点

 

 

9.  多线程复制(包括其他一些复制的改进)

没什么好说的,众望所归

 

 

10.在备库上延迟更新,这可以避免在有误操作时的补救措施

 

11.row模式复制时,不记录全部数据前镜像(减少网络传输)

通过参数binlog_row_image来控制,这还是比较有用的,因为就算现在5.5及之前的版本,如果存在主键时,也只用到前镜像的主键值,前镜像其他列的值并不做判断。

设置为full,跟之前版本行为相同

设置为minimal,只在前镜像记录那些可以标记一条记录的列,例如主键值;只记录后镜像中修改过的列

设置为noblob,在没有blob/text类型列时,行为和all相同,当blob列不作为标示列或被修改的列时,就不在binlog中记录。

 

 

12.GET DIAGNOSTICS  语句

 

 

13.更好的处理错误或warning信息

 

和存储过程中获取错误/警告信息有关。

具体查阅 here and here

 

 

Performance Schema也引入了巨大的改进,例如这篇博客,作者根据Performance Schema进行性能瓶颈挖掘,一步步定位到问题

以下为Performance Schema的一些新特性

14.可以观察某些特定表的IO操作;

15,可以观察某些特定SQL事件(events_statements_*

16,events_stages_*表

17,可以对PS信息进行聚合,例如根据用户名,host等,由于PS也存储了历史信息,可以聚合这些信息做性能分析

18,新的host_cache表,cache的域名被保存在内存中,这样就无需查询DNS服务器,之前版本这些信息对用户是不可见的。

 

其他还有许多相关的Performance Schema表信息,详细见官方文档 

 


相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
相关文章
|
9月前
|
NoSQL 算法 Redis
【Docker】(3)学习Docker中 镜像与容器数据卷、映射关系!手把手带你安装 MySql主从同步 和 Redis三主三从集群!并且进行主从切换与扩容操作,还有分析 哈希分区 等知识点!
Union文件系统(UnionFS)是一种**分层、轻量级并且高性能的文件系统**,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single virtual filesystem) Union 文件系统是 Docker 镜像的基础。 镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。
924 6
|
10月前
|
SQL 关系型数据库 MySQL
Mysql基础学习day01
本课程为MySQL基础学习第一天内容,涵盖MySQL概述、安装、SQL简介及其分类(DDL、DML、DQL、DCL)、数据库操作(查询、创建、使用、删除)及表操作(创建、约束、数据类型)。适合初学者入门学习数据库基本概念和操作方法。
311 6
|
10月前
|
关系型数据库 MySQL 数据管理
Mysql基础学习day03-作业
本内容包含数据库建表语句及多表查询示例,涵盖内连接、外连接、子查询及聚合统计,适用于员工与部门数据管理场景。
186 1
|
10月前
|
SQL 关系型数据库 MySQL
Mysql基础学习day02-作业
本教程介绍了数据库表的创建与管理操作,包括创建员工表、插入测试数据、删除记录、更新数据以及多种查询操作,涵盖了SQL语句的基本使用方法,适合初学者学习数据库操作基础。
202 0
|
10月前
|
SQL 关系型数据库 MySQL
Mysql基础学习day03
本课程为MySQL基础学习第三天内容,主要讲解多表关系与多表查询。内容涵盖物理外键与逻辑外键的区别、一对多、一对一及多对多关系的实现方式,以及内连接、外连接、子查询等多表查询方法,并通过具体案例演示SQL语句的编写与应用。
275 0
|
10月前
|
SQL 关系型数据库 MySQL
Mysql基础学习day01-作业
本教程包含三个数据库表的创建练习:学生表(student)要求具备主键、自增长、非空、默认值及唯一约束;课程表(course)定义主键、非空唯一字段及数值精度限制;员工表(employee)包含自增主键、非空字段、默认值、唯一电话号及日期时间类型字段。每个表的结构设计均附有详细SQL代码示例。
182 0
|
10月前
|
SQL 关系型数据库 MySQL
Mysql基础学习day02
本课程为MySQL基础学习第二天内容,涵盖数据定义语言(DDL)的表查询、修改与删除操作,以及数据操作语言(DML)的增删改查功能。通过具体SQL语句与实例演示,帮助学习者掌握MySQL表结构操作及数据管理技巧。
243 0
|
SQL 存储 关系型数据库
【MySQL基础篇】全面学习总结SQL语法、DataGrip安装教程
本文详细介绍了MySQL中的SQL语法,包括数据定义(DDL)、数据操作(DML)、数据查询(DQL)和数据控制(DCL)四个主要部分。内容涵盖了创建、修改和删除数据库、表以及表字段的操作,以及通过图形化工具DataGrip进行数据库管理和查询。此外,还讲解了数据的增、删、改、查操作,以及查询语句的条件、聚合函数、分组、排序和分页等知识点。
1486 57
【MySQL基础篇】全面学习总结SQL语法、DataGrip安装教程
|
关系型数据库 MySQL Java
Django学习二:配置mysql,创建model实例,自动创建数据库表,对mysql数据库表已经创建好的进行直接操作和实验。
这篇文章是关于如何使用Django框架配置MySQL数据库,创建模型实例,并自动或手动创建数据库表,以及对这些表进行操作的详细教程。
1046 0
Django学习二:配置mysql,创建model实例,自动创建数据库表,对mysql数据库表已经创建好的进行直接操作和实验。
|
Java 关系型数据库 MySQL
springboot学习五:springboot整合Mybatis 连接 mysql数据库
这篇文章是关于如何使用Spring Boot整合MyBatis来连接MySQL数据库,并进行基本的增删改查操作的教程。
3147 0
springboot学习五:springboot整合Mybatis 连接 mysql数据库

推荐镜像

更多