【原创】MySQL 5.7 SYS系统SCHEMA

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介:

在说明系统数据库之前,先来看下MySQL在数据字典方面的演变历史:

MySQL4.1 提供了information_schema 数据字典。从此可以很简单的用SQL语句来检索需要的系统元数据了。

MySQL5.5 提供了performance_schema 性能字典。 但是这个字典比较专业,一般人可能也就看看就不了了之了。

MySQL5.7 提供了 sys系统数据库。 sys数据库里面包含了一系列的存储过程、自定义函数以及视图来帮助我们快速的了解系统的元数据信息。


sys系统数据库结合了information_schema和performance_schema的相关数据,让我们更加容易的检索元数据。 现在呢,我就示范下几种场景下如何快速的使用。


第一,

比如之前想要知道某个表是否存在与否,可以用以下两种方法:

A, 悲观的方法,写SQL从information_schema中拿信息:

1
2
3
4
5
6
7
mysql>  SELECT  IF( COUNT (*) = 0, 'Not exists!' , 'Exists!' AS  'result'  FROM  information_schema.tables  WHERE  table_schema =  'new_feature'  AND  table_name =  't1' ;
+ -------------+
| result      |
+ -------------+
Not  exists! |
+ -------------+
1 row  in  set  (0.00 sec)


B,乐观的方法,假设表存在,写一个存储过程:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
DELIMITER $$
USE `new_feature`$$
DROP  PROCEDURE  IF EXISTS `sp_table_exists`$$
CREATE  DEFINER=`root`@`localhost`  PROCEDURE  `sp_table_exists`(
     IN  db_name  VARCHAR (64),
     IN  tb_name  VARCHAR (64),
     OUT  is_exists  VARCHAR (60)
     )
BEGIN
       DECLARE  no_such_table CONDITION  FOR  1146;
       DECLARE  EXIT HANDLER  FOR  no_such_table
       BEGIN
         SET  is_exists =  'Not exists!' ;
       END ;
       
       SET  @stmt = CONCAT( 'select 1 from ' ,db_name, '.' ,tb_name);
       PREPARE  s1  FROM  @stmt;
       EXECUTE  s1;
       DEALLOCATE  PREPARE  s1;
       SET  is_exists =  'Exists!' ;
     END $$
DELIMITER ;


现在来调用:

1
2
3
4
5
6
7
8
9
mysql> call sp_table_exists( 'new_feature' , 't1' ,@result);
Query OK, 0  rows  affected (0.00 sec)
mysql>  select  @result;
+ -------------+
| @result     |
+ -------------+
Not  exists! |
+ -------------+
1 row  in  set  (0.00 sec)

现在我们直接用sys数据库里面现有的存储过程来进行调用,

1
2
3
4
5
6
7
8
9
mysql> CALL table_exists( 'new_feature' , 't1' ,@v_is_exists);
Query OK, 0  rows  affected (0.00 sec)
mysql>  SELECT  IF(@v_is_exists =  '' , 'Not exists!' ,@v_is_exists)  AS  'result' ;
+ -------------+
| result      |
+ -------------+
Not  exists! |
+ -------------+
1 row  in  set  (0.00 sec)


第二,获取没有使用过的索引。

1
2
3
4
5
6
7
8
mysql>  SELECT  FROM  schema_unused_indexes;
+ ---------------+-------------+--------------+
| object_schema | object_name | index_name   |
+ ---------------+-------------+--------------+
| new_feature   | t1          | idx_log_time |
| new_feature   | t1          | idx_rank2    |
+ ---------------+-------------+--------------+
rows  in  set  (0.00 sec)


第三, 检索指定数据库下面的表扫描信息,过滤出执行次数大于10的查询,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
mysql>  SELECT  FROM  statement_analysis  WHERE  db= 'new_feature'  AND  full_scan =  '*'   AND  exec_count > 10\G
*************************** 1. row ***************************
             query: SHOW STATUS 
                db: new_feature
         full_scan: *
        exec_count: 26
         err_count: 0
        warn_count: 0
     total_latency: 74.68 ms
       max_latency: 3.86 ms
       avg_latency: 2.87 ms
      lock_latency: 4.50 ms
         rows_sent: 9594
     rows_sent_avg: 369
     rows_examined: 9594
rows_examined_avg: 369
     rows_affected: 0
rows_affected_avg: 0
        tmp_tables: 0
   tmp_disk_tables: 0
       rows_sorted: 0
sort_merge_passes: 0
            digest: 475fa3ad9d4a846cfa96441050fc9787
        first_seen: 2015-11-16 10:51:17
         last_seen: 2015-11-16 11:28:13
*************************** 2. row ***************************
             query:  SELECT  `state` , `round` (  SUM  ... uration (summed)  in  sec`  DESC 
                db: new_feature
         full_scan: *
        exec_count: 12
         err_count: 0
        warn_count: 12
     total_latency: 16.43 ms
       max_latency: 2.39 ms
       avg_latency: 1.37 ms
      lock_latency: 3.54 ms
         rows_sent: 140
     rows_sent_avg: 12
     rows_examined: 852
rows_examined_avg: 71
     rows_affected: 0
rows_affected_avg: 0
        tmp_tables: 24
   tmp_disk_tables: 0
       rows_sorted: 140
sort_merge_passes: 0
            digest: 538e506ee0075e040b076f810ccb5f5c
        first_seen: 2015-11-16 10:51:17
         last_seen: 2015-11-16 11:28:13
rows  in  set  (0.01 sec)


第四, 同样继续上面的,过滤出有临时表的查询,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
mysql>  SELECT  FROM  statement_analysis  WHERE  db= 'new_feature'  AND  tmp_tables > 0  ORDER  BY  tmp_tables  DESC  LIMIT 1\G
*************************** 1. row ***************************
             query:  SELECT  `performance_schema` .  ...  name ` . `SUM_TIMER_WAIT`  DESC 
                db: new_feature
         full_scan: *
        exec_count: 2
         err_count: 0
        warn_count: 0
     total_latency: 87.96 ms
       max_latency: 59.50 ms
       avg_latency: 43.98 ms
      lock_latency: 548.00 us
         rows_sent: 101
     rows_sent_avg: 51
     rows_examined: 201
rows_examined_avg: 101
     rows_affected: 0
rows_affected_avg: 0
        tmp_tables: 332
   tmp_disk_tables: 15
       rows_sorted: 0
sort_merge_passes: 0
            digest: ff9bdfb7cf3f44b2da4c52dcde7a7352
        first_seen: 2015-11-16 10:24:42
         last_seen: 2015-11-16 10:24:42
1 row  in  set  (0.01 sec)


可以看到上面查询详细的详细,再也不用执行show status 手工去过滤了。



第五, 检索执行次数排名前五的语句,

1
2
3
4
5
6
7
8
9
10
11
mysql>  SELECT  statement,total  FROM  user_summary_by_statement_type  WHERE  ` user `= 'root'  ORDER  BY  total  DESC  LIMIT 5;
+ -------------------+-------+
| statement         | total |
+ -------------------+-------+
| jump_if_not       | 17635 |
| freturn           |  3120 |
| show_create_table |   289 |
| Field List        |   202 |
| set_option        |   190 |
+ -------------------+-------+
rows  in  set  (0.01 sec)

示例我就写这么多了,详细的去看使用手册并且自己摸索去吧。








本文转自 david_yeung 51CTO博客,原文链接:http://blog.51cto.com/yueliangdao0608/1716616,如需转载请自行联系原作者

相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
如何将数据从MySQL同步到其他系统
【10月更文挑战第17天】如何将数据从MySQL同步到其他系统
921 0
纯PHP+MySQL手搓高性能论坛系统!代码精简,拒绝臃肿
本内容分享了一套经实战验证的社交系统架构设计,支撑从1到100万用户的发展,并历经6次流量洪峰考验。架构涵盖客户端层(App、小程序、公众号)、接入层(API网关、负载均衡、CDN)、业务服务层(用户、内容、关系、消息等服务)、数据层(MySQL、Redis、MongoDB等)及运维监控层(日志、监控、告警)。核心设计包括数据库分库分表、多级缓存体系、消息队列削峰填谷、CQRS模式与热点数据动态缓存。同时提供应对流量洪峰的弹性伸缩方案及降级熔断机制,并通过Prometheus实现全链路监控。开源建议结构清晰,适合大型社交平台构建与优化。
68 11
在Ubuntu系统的Docker上安装MySQL的方法
以上的步骤就是在Ubuntu系统的Docker上安装MySQL的详细方法,希望对你有所帮助!
49 12
【02】Java+若依+vue.js技术栈实现钱包积分管理系统项目-商业级电玩城积分系统商业项目实战-ui设计图figmaUI设计准备-figma汉化插件-mysql数据库设计-优雅草卓伊凡商业项目实战
【02】Java+若依+vue.js技术栈实现钱包积分管理系统项目-商业级电玩城积分系统商业项目实战-ui设计图figmaUI设计准备-figma汉化插件-mysql数据库设计-优雅草卓伊凡商业项目实战
125 14
【02】Java+若依+vue.js技术栈实现钱包积分管理系统项目-商业级电玩城积分系统商业项目实战-ui设计图figmaUI设计准备-figma汉化插件-mysql数据库设计-优雅草卓伊凡商业项目实战
Linux系统如何设置自启动服务在MySQL数据库启动后执行?
【10月更文挑战第25天】Linux系统如何设置自启动服务在MySQL数据库启动后执行?
339 3
PACS系统 中 dicom 文件在mysql 8.0 数据库中的 存储和读取(pydicom 库使用)
PACS系统 中 dicom 文件在mysql 8.0 数据库中的 存储和读取(pydicom 库使用)
150 2
Linux系统MySQL安装
【10月更文挑战第19天】本文介绍了在 Linux 系统上安装 MySQL 的步骤,包括安装前准备、安装 MySQL、启动 MySQL 服务、配置 MySQL 以及验证安装。适用于 Ubuntu/Debian 和 CentOS/Fedora 系统,提供了详细的命令示例。
798 1
MySQL是一个广泛使用的开源关系型数据库管理系统,它有许多不同的版本
【10月更文挑战第3天】MySQL是一个广泛使用的开源关系型数据库管理系统,它有许多不同的版本
371 5

推荐镜像

更多
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等