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
值为NO
ENABLED
值为YES
,则根据setup_objects
相关行的ENABLED
值进行事件监控:
-
db1.t1
事件被监控 -
db1.t2
事件不被监控 -
db2.t3
事件被监控 -
db3.t4
事件不被监控 -
db4.t5
事件被监控
对于从setup_instruments
和setup_objects
表中TIMED
列的组合逻辑类似,用于确定是否收集事件时间信息。
如果一个持久表和一个临时表具有相同的名称,则在setup_objects
行中进行匹配的方式对于两个表都是相同的。无法为一个表启用监控而不为另一个表启用。但是,每个表都单独进行了仪器。