MySQL 5.7 SYS系统SCHEMA

在说明系统数据库之前,先来看下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))BEGINDECLARE no_such_table CONDITION FOR 1146;DECLARE EXIT HANDLER FOR no_such_tableBEGINSET 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 STATUSdb: new_featurefull_scan: *exec_count: 26err_count: 0warn_count: 0total_latency: 74.68 msmax_latency: 3.86 msavg_latency: 2.87 mslock_latency: 4.50 msrows_sent: 9594rows_sent_avg: 369rows_examined: 9594rows_examined_avg: 369rows_affected: 0rows_affected_avg: 0tmp_tables: 0 tmp_disk_tables: 0rows_sorted: 0sort_merge_passes: 0digest: 475fa3ad9d4a846cfa96441050fc9787first_seen: 2015-11-16 10:51:17last_seen: 2015-11-16 11:28:13*************************** 2. row ***************************query: SELECT `state` , `round` ( SUM … uration (summed) in sec` DESCdb: new_featurefull_scan: *exec_count: 12err_count: 0warn_count: 12total_latency: 16.43 msmax_latency: 2.39 msavg_latency: 1.37 mslock_latency: 3.54 msrows_sent: 140rows_sent_avg: 12rows_examined: 852rows_examined_avg: 71rows_affected: 0rows_affected_avg: 0tmp_tables: 24 tmp_disk_tables: 0rows_sorted: 140sort_merge_passes: 0digest: 538e506ee0075e040b076f810ccb5f5cfirst_seen: 2015-11-16 10:51:17last_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` DESCdb: new_featurefull_scan: *exec_count: 2err_count: 0warn_count: 0total_latency: 87.96 msmax_latency: 59.50 msavg_latency: 43.98 mslock_latency: 548.00 usrows_sent: 101rows_sent_avg: 51rows_examined: 201rows_examined_avg: 101rows_affected: 0rows_affected_avg: 0tmp_tables: 332 tmp_disk_tables: 15rows_sorted: 0sort_merge_passes: 0digest: ff9bdfb7cf3f44b2da4c52dcde7a7352first_seen: 2015-11-16 10:24:42last_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)示例我就写这么多了,详细的去看使用手册并且自己摸索去吧。

我们一直在旅行,一直在等待某个人可以成为我们旅途的伴侣,

MySQL 5.7 SYS系统SCHEMA

相关文章:

你感兴趣的文章:

标签云: