29.4.5 按对象预过滤
表格setup_objects控制性能模式是否监控特定的表和存储程序对象。初始setup_objects内容看起来像这样:
mysql> SELECT * FROM performance_schema.setup_objects;
+-------------+--------------------+-------------+---------+-------+
| OBJECT_TYPE | OBJECT_SCHEMA | OBJECT_NAME | ENABLED | TIMED |
+-------------+--------------------+-------------+---------+-------+
| EVENT | mysql | % | NO | NO |
| EVENT | performance_schema | % | NO | NO |
| EVENT | information_schema | % | NO | NO |
| EVENT | % | % | YES | YES |
| FUNCTION | mysql | % | NO | NO |
| FUNCTION | performance_schema | % | NO | NO |
| FUNCTION | information_schema | % | NO | NO |
| FUNCTION | % | % | YES | YES |
| PROCEDURE | mysql | % | NO | NO |
| PROCEDURE | performance_schema | % | NO | NO |
| PROCEDURE | information_schema | % | NO | NO |
| PROCEDURE | % | % | YES | YES |
| TABLE | mysql | % | NO | NO |
| TABLE | performance_schema | % | NO | NO |
| TABLE | information_schema | % | NO | NO |
| TABLE | % | % | YES | YES |
| TRIGGER | mysql | % | NO | NO |
| TRIGGER | performance_schema | % | NO | NO |
| TRIGGER | information_schema | % | NO | NO |
| TRIGGER | % | % | YES | YES |
+-------------+--------------------+-------------+---------+-------+
对setup_objects表的修改会立即影响对象监控。
OBJECT_TYPE列指示一个行适用的对象类型。对setup_objects中的TABLE过滤影响表I/O事件(wait/io/table/sql/handler工具)和表锁定事件(wait/lock/table/sql/handler工具)。
OBJECT_SCHEMA和OBJECT_NAME列应包含一个字面量的模式或对象名称,或者是'%'以匹配任何名称。
ENABLED列指示是否监控匹配的对象,而TIMED指示是否收集时间信息。设置TIMED列会影响性能模式表格内容,如第29.4.1节“性能模式事件计时”中所述。
默认对象配置的效果是对除mysql、INFORMATION_SCHEMA和performance_schema数据库中的表进行监控。(INFORMATION_SCHEMA数据库中的表不论setup_objects的内容如何,都会被忽略。)
当性能模式检查setup_objects中的匹配时,它会先尝试找到更具体的匹配。对于OBJECT_TYPE列匹配的行,性能模式检查顺序如下:
-
具有
OBJECT_SCHEMA='和literal'OBJECT_NAME='的行。literal' -
具有
OBJECT_SCHEMA='和literal'OBJECT_NAME='%'的行。 -
具有
OBJECT_SCHEMA='%'和OBJECT_NAME='%'的行。
例如,对于表db1.t1,性能模式会在TABLE行中查找匹配'db1'和't1',然后是'db1'和'%',最后是'%'和'%'。匹配顺序很重要,因为不同的匹配setup_objects行可以有不同的ENABLED和TIMED值。
对于表相关事件,性能模式将setup_objects的内容与setup_instruments结合起来,以确定是否启用工具以及是否为已启用的工具收集时间信息:
-
对于
setup_objects中的表行,表工具只在setup_instruments和setup_objects中都有ENABLED为YES时才产生事件。 -
在两个表格中
TIMED值的组合会确保只有当两者都是YES时,才收集时间信息。
对于存储程序对象,性能_schema直接从setup_objects行获取ENABLED和TIMED列,没有将这些值与setup_instruments表结合使用。
假设setup_objects包含以下适用于db1、db2和db3的TABLE行:
+-------------+---------------+-------------+---------+-------+
| OBJECT_TYPE | OBJECT_SCHEMA | OBJECT_NAME | ENABLED | TIMED |
+-------------+---------------+-------------+---------+-------+
| TABLE | db1 | t1 | YES | YES |
| TABLE | db1 | t2 | NO | NO |
| TABLE | db2 | % | YES | YES |
| TABLE | db3 | % | NO | NO |
| TABLE | % | % | YES | YES |
+-------------+---------------+-------------+---------+-------+
如果setup_instruments中的对象相关仪器的ENABLED值为NOENABLED值为YES,则根据setup_objects相关行的ENABLED值进行事件监控:
-
db1.t1事件被监控 -
db1.t2事件不被监控 -
db2.t3事件被监控 -
db3.t4事件不被监控 -
db4.t5事件被监控
对于从setup_instruments和setup_objects表中TIMED列的组合逻辑类似,用于确定是否收集事件时间信息。
如果一个持久表和一个临时表具有相同的名称,则在setup_objects行中进行匹配的方式对于两个表都是相同的。无法为一个表启用监控而不为另一个表启用。但是,每个表都单独进行了仪器。