千金良方:MySQL性能优化金字塔法则
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

7.2 sys系统库初体验

如果使用了USE语句切换默认数据库,那么就可以直接使用sys系统库下的视图进行查询,就像查询某个库下的表一样操作。

# 使用version视图可以查看sys系统库和MySQL Server的版本号
mysql> USE sys;
mysql> SELECT * FROM version;
+ ------------ + -----------------+
| sys_version  | mysql_version    |
+ ------------ + -----------------+
| 1.5.0         | 5.7.9-debug-log  |
+ ------------ + -----------------+

也可以使用db_name.view_name、db_name.procedure_name、db_name.func_name等方式,在不指定默认数据库的情况下访问sys系统库中的对象(这叫作名称限定对象引用)。

mysql> SELECT * FROM sys.version;
+ ------------- + ----------------- +
| sys_version   | mysql_version     |
+ ------------- + ----------------- +
| 1.5.0 | 5.7.9-debug-log           |
+ ------------- + ----------------- +

提示:在下文的示例中,对于sys系统库的访问都假定指定了默认数据库为sys系统库。

在sys系统库下包含很多视图,它们以各种方式对performance_schema表进行聚合计算展示。这些视图大部分是成对出现的,两个视图名称相同,但有一个视图是带“x$”前缀的,例如:host_summary_by_file_io和x$host_summary_by_file_io,代表按照主机进行汇总统计的文件I/O性能数据,两个视图访问的数据源是相同的,但是在创建视图的语句中,不带“x$”前缀的视图显示的是相关数值经过单位换算后的数据(单位是毫秒、秒、分钟、小时、天等),带“x$”前缀的视图显示的是原始的数据(单位是皮秒)。

# 使用 x$host_summary_by_file_io 视图汇总数据,显示未格式化的延迟时间(单位是皮秒),没有“x$”前缀的视图输出的信息经过单位换算之后可读性更好
mysql> SELECT * FROM host_summary_by_file_io;
+------------+-------+------------+
| host       | ios   | io_latency |
+------------+-------+------------+
| localhost  | 67570 | 5.38 s     |
| background |  3468 | 4.18 s     |
+------------+-------+------------+
# 带“x$”前缀的视图显示原始的数据(单位是皮秒),对于程序或工具的获取使用更易于数据处理
mysql> SELECT * FROM x$host_summary_by_file_io;
+------------+-------+---------------+
| host       | ios   | io_latency    |
+------------+-------+---------------+
| localhost  | 67574 | 5380678125144 |
| background |  3474 | 4758696829416 |
+------------+-------+---------------+

要查看sys系统库对象定义语句,可以使用适当的SHOW语句或INFORMATION_SCHEMA库查询。例如,要查看session视图和format_bytes()函数的定义,可以使用如下语句:

mysql> SHOW CREATE VIEW session;
mysql> SHOW CREATE FUNCTION format_bytes;

然而,这些语句文本是经过格式化的,可读性比较差。要查看更易读的格式对象定义语句,可以访问sys系统库开发网站https://github.com/mysql/mysql-sys上的各个.sql文件,或者使用mysqldump和mysqlpump工具导出sys系统库,在默认情况下,mysqldump和mysqlpump都不会导出sys系统库。要生成包含sys系统库的导出文件,可以使用如下命令显式指定sys系统库(虽然可以导出视图定义,但是与原始的定义语句相比仍然缺失了相当一部分内容,只是可读性比直接使用SHOW CREATE VIEW要好一些)。

[root@localhost]# mysqldump --databases --routines sys> sys_dump.sql
[root@localhost]# mysqlpump sys> sys_dump.sql

如果要重新导入sys系统库,则可以使用如下命令:

[root@localhost]# mysql < sys_dump.sql