在说明系统数据库之前,先来看下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: 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
第四, 同样继续上面的,过滤出有临时表的查询,
-
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 手工去过滤了。
第五, 检索执行次数排名前五的语句,
-
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)
示例我就写这么多了,详细的去看使用手册并且自己摸索去吧。
阅读(9762) | 评论(0) | 转发(0) |