热门标签 | 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


推荐阅读
  • flea,frame,db,使用,之 ... [详细]
  • Maven + Spring + MyBatis + MySQL 环境搭建与实例解析
    本文详细介绍如何使用MySQL数据库进行环境搭建,包括创建数据库表并插入示例数据。随后,逐步指导如何配置Maven项目,整合Spring框架与MyBatis,实现高效的数据访问。 ... [详细]
  • 如何将955万数据表的17秒SQL查询优化至300毫秒
    本文详细介绍了通过优化SQL查询策略,成功将一张包含955万条记录的财务流水表的查询时间从17秒缩短至300毫秒的方法。文章不仅提供了具体的SQL优化技巧,还深入探讨了背后的数据库原理。 ... [详细]
  • 本文探讨了如何通过Service Locator模式来简化和优化在B/S架构中的服务命名访问,特别是对于需要频繁访问的服务,如JNDI和XMLNS。该模式通过缓存机制减少了重复查找的成本,并提供了对多种服务的统一访问接口。 ... [详细]
  • 本文将从基础概念入手,详细探讨SpringMVC框架中DispatcherServlet如何通过HandlerMapping进行请求分发,以及其背后的源码实现细节。 ... [详细]
  • 流处理中的计数挑战与解决方案
    本文探讨了在流处理中进行计数的各种技术和挑战,并基于作者在2016年圣何塞举行的Hadoop World大会上的演讲进行了深入分析。文章不仅介绍了传统批处理和Lambda架构的局限性,还详细探讨了流处理架构的优势及其在现代大数据应用中的重要作用。 ... [详细]
  • 本文探讨了在Windows系统中运行Apache服务器时频繁出现崩溃的问题,并提供了多种可能的解决方案和建议。错误日志显示多个子进程因达到最大请求限制而退出。 ... [详细]
  • 本文探讨了在SQL Server 2008环境下,当尝试删除拥有数据库架构的用户时遇到的问题及解决方案,包括如何查询和更改架构所有权。 ... [详细]
  • 如何在U8系统中连接服务器并获取数据
    本文介绍了如何在U8系统中通过不同的方法连接服务器并获取数据,包括使用MySQL客户端连接实例的方法,如非SSL连接和SSL连接,并提供了详细的步骤和注意事项。 ... [详细]
  • 软件测试行业深度解析:迈向高薪的必经之路
    本文深入探讨了软件测试行业的发展现状及未来趋势,旨在帮助有志于在该领域取得高薪的技术人员明确职业方向和发展路径。 ... [详细]
  • 入门指南:使用FastRPC技术连接Qualcomm Hexagon DSP
    本文旨在为初学者提供关于如何使用FastRPC技术连接Qualcomm Hexagon DSP的基础知识。FastRPC技术允许开发者在本地客户端实现远程调用,从而简化Hexagon DSP的开发和调试过程。 ... [详细]
  • CentOS下ProFTPD的安装与配置指南
    本文详细介绍在CentOS操作系统上安装和配置ProFTPD服务的方法,包括基本配置、安全设置及高级功能的启用。 ... [详细]
  • 本文介绍了ADO.NET框架中的五个关键组件:Connection、Command、DataAdapter、DataSet和DataReader。每个组件都在数据访问和处理过程中扮演着不可或缺的角色。 ... [详细]
  • 如何高效解决Android应用ANR问题?
    本文介绍了ANR(应用程序无响应)的基本概念、常见原因及其解决方案,并提供了实用的工具和技巧帮助开发者快速定位和解决ANR问题,提高应用的用户体验。 ... [详细]
  • PGXC中的两阶段提交机制及其对事务一致性的保障
    PGXC作为一款基于PostgreSQL的分布式数据库系统,利用Sharding技术将数据分散存储于多个数据库实例中。本文探讨了PGXC的两阶段提交过程及其实现事务强一致性的方法。 ... [详细]
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社区 版权所有