性能模式的 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
指示行应用于的对象类型。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
数据库中的对象。(无论 setup_objects
的内容如何,INFORMATION_SCHEMA
数据库中的表都不会被监控;行 information_schema.%
只是明确地表明默认行为。)
当性能模式检查 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
行的表,表仪器仅在ENABLED
在setup_instruments
和setup_objects
都是YES
时产生事件。 -
两个表中的
TIMED
值被组合,以便仅当两个值都是YES
时才收集计时信息。
对于存储程序对象,性能模式从 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
行的匹配方式相同,不管是持久表还是临时表。无法为一个表启用监控而不启用另一个表。然而,每个表都是单独仪器的。