热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

【原创】深入解析MySQL5.7SYS模式架构与应用

本文首先回顾了MySQL在数据字典方面的发展历程,从MySQL4.1引入的information_schema数据字典开始,使得用户能够通过标准SQL查询轻松获取系统元数据。在此基础上,深入探讨了MySQL5.7中SYS模式的架构与应用场景,详细解析了其在性能监控、查询优化等方面的优势与实际应用。

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

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

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

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


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


第一,

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

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

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,乐观的方法,假设表存在,写一个存储过程:

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 ;


现在来调用:

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数据库里面现有的存储过程来进行调用,

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)


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

mysql> SELECT * FROM schema_unused_indexes;+---------------+-------------+--------------+| object_schema | object_name | index_name   |+---------------+-------------+--------------+| new_feature   | t1          | idx_log_time || new_feature   | t1          | idx_rank2    |+---------------+-------------+--------------+2 rows in set (0.00 sec)


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

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: 9594rows_examined_avg: 369    rows_affected: 0rows_affected_avg: 0       tmp_tables: 0  tmp_disk_tables: 0      rows_sorted: 0sort_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: 852rows_examined_avg: 71    rows_affected: 0rows_affected_avg: 0       tmp_tables: 24  tmp_disk_tables: 0      rows_sorted: 140sort_merge_passes: 0           digest: 538e506ee0075e040b076f810ccb5f5c       first_seen: 2015-11-16 10:51:17        last_seen: 2015-11-16 11:28:132 rows in set (0.01 sec)


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

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: 201rows_examined_avg: 101    rows_affected: 0rows_affected_avg: 0       tmp_tables: 332  tmp_disk_tables: 15      rows_sorted: 0sort_merge_passes: 0           digest: ff9bdfb7cf3f44b2da4c52dcde7a7352       first_seen: 2015-11-16 10:24:42        last_seen: 2015-11-16 10:24:421 row in set (0.01 sec)


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



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

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 |+-------------------+-------+5 rows in set (0.01 sec)

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


本文出自 “上帝,咱们不见不散!” 博客,请务必保留此出处http://yueliangdao0608.blog.51cto.com/397025/1716616


推荐阅读
  • 优化SQL Server批量数据插入存储过程的实现
    本文介绍了一种改进的SQL Server存储过程,用于生成批量插入语句。该方法不仅提高了性能,还支持单行和多行模式,适用于SQL Server 2005及以上版本。 ... [详细]
  • 本文详细介绍了如何在Kendo UI for jQuery的数据管理组件中,将行标题字段呈现为锚点(即可点击链接),帮助开发人员更高效地实现这一功能。通过具体的代码示例和解释,即使是新手也能轻松掌握。 ... [详细]
  • 版本控制工具——Git常用操作(下)
    本文由云+社区发表作者:工程师小熊摘要:上一集我们一起入门学习了git的基本概念和git常用的操作,包括提交和同步代码、使用分支、出现代码冲突的解决办法、紧急保存现场和恢复 ... [详细]
  • SpringMVC RestTemplate的几种请求调用(转)
    SpringMVCRestTemplate的几种请求调用(转),Go语言社区,Golang程序员人脉社 ... [详细]
  • 本文深入探讨了MySQL中常见的面试问题,包括事务隔离级别、存储引擎选择、索引结构及优化等关键知识点。通过详细解析,帮助读者在面对BAT等大厂面试时更加从容。 ... [详细]
  • docker镜像重启_docker怎么启动镜像dock ... [详细]
  • 本文介绍了数据库体系的基础知识,涵盖关系型数据库(如MySQL)和非关系型数据库(如MongoDB)的基本操作及高级功能。通过三个阶段的学习路径——基础、优化和部署,帮助读者全面掌握数据库的使用和管理。 ... [详细]
  • JavaScript 中创建对象的多种方法
    本文详细介绍了 JavaScript 中创建对象的几种常见方式,包括对象字面量、构造函数和 Object.create 方法,并提供了示例代码和属性描述符的解释。 ... [详细]
  • 本文详细介绍了优化DB2数据库性能的多种方法,涵盖统计信息更新、缓冲池调整、日志缓冲区配置、应用程序堆大小设置、排序堆参数调整、代理程序管理、锁机制优化、活动应用程序限制、页清除程序配置、I/O服务器数量设定以及编入组提交数调整等方面。通过这些技术手段,可以显著提升数据库的运行效率和响应速度。 ... [详细]
  • 本文深入探讨了SQL数据库中常见的面试问题,包括如何获取自增字段的当前值、防止SQL注入的方法、游标的作用与使用、索引的形式及其优缺点,以及事务和存储过程的概念。通过详细的解答和示例,帮助读者更好地理解和应对这些技术问题。 ... [详细]
  • Oracle中NULL、空字符串和空格的处理与区别
    本文探讨了在Oracle数据库中使用NULL、空字符串('')和空格('_')时可能遇到的问题及解决方案。重点解释了它们之间的区别,以及在查询和函数中的行为。 ... [详细]
  • 在Fedora 31上部署PostgreSQL 12
    本文详细介绍如何在Fedora 31操作系统上安装和配置PostgreSQL 12数据库。包括环境准备、安装步骤、配置优化以及安全设置,确保数据库能够稳定运行并提供高效的性能。 ... [详细]
  • 本文详细介绍了 Python 中的条件语句和循环结构。主要内容包括:1. 分支语句(if...elif...else);2. 循环语句(for, while 及嵌套循环);3. 控制循环的语句(break, continue, else)。通过具体示例,帮助读者更好地理解和应用这些语句。 ... [详细]
  • 本文将详细介绍如何在没有显示器的情况下,使用Raspberry Pi Imager为树莓派4B安装操作系统,并进行基本配置,包括设置SSH、WiFi连接以及更新软件源。 ... [详细]
  • 本文详细介绍了如何在 Android 中使用值动画(ValueAnimator)来动态调整 ImageView 的高度,并探讨了相关的关键属性和方法,包括图片填充后的高度、原始图片高度、动画变化因子以及布局重置等。 ... [详细]
author-avatar
mobiledu2502926333
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有