25.4.5 按对象进行预过滤
setup_objectstable 控制性能模式是否监视特定的 table 和存储的程序对象。最初的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_objectstable 的修改会立即影响对象监视。
OBJECT_TYPE
列指示行适用的对象的类型。 TABLE
过滤会影响 tableI/O 事件(wait/io/table/sql/handler
工具)和 table 锁定事件(wait/lock/table/sql/handler
工具)。
OBJECT_SCHEMA
和OBJECT_NAME
列应包含 Literals 模式或对象名称,或'%'
以匹配任何名称。
ENABLED
列指示是否监视匹配的对象,TIMED
列指示是否收集定时信息。设置TIMED
列会影响性能模式 table 的内容,如第 25.4.1 节“性能架构事件计时”中所述。
默认对象配置的作用是检测除mysql
,INFORMATION_SCHEMA
和performance_schema
数据库中的对象以外的所有对象。 (无论setup_objects的内容如何,都不会检测INFORMATION_SCHEMA
数据库中的 table; information_schema.%
的行仅使此默认值明确。)
当性能模式在setup_objects中检查匹配项时,它将尝试首先查找更具体的匹配项。对于与给定OBJECT_TYPE
匹配的行,性能模式将按以下 Sequences 检查行:
-
具有
OBJECT_SCHEMA='literal'
和OBJECT_NAME='literal'
的行。 -
具有
OBJECT_SCHEMA='literal'
和OBJECT_NAME='%'
的行。 -
具有
OBJECT_SCHEMA='%'
和OBJECT_NAME='%'
的行。
例如,对于 tabledb1.t1
,性能模式在TABLE
行中查找'db1'
和't1'
的匹配项,然后是'db1'
和'%'
的匹配项,然后是'%'
和'%'
的匹配项。匹配发生的 Sequences 很重要,因为不同的匹配setup_objects行可以具有不同的ENABLED
和TIMED
值。
对于与 table 相关的事件,性能模式将setup_objects和setup_instruments的内容结合起来,以确定是否启用工具以及是否对启用的工具进行计时:
-
对于与setup_objects中的行匹配的 table,仅当setup_instruments和setup_objects中的
ENABLED
为YES
时,table 工具才会产生事件。 -
将两个 table 中的
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_objectstable 中的TIMED
列以确定是否收集事件定时信息。
如果永久 table 和临时 table 具有相同的名称,则针对setup_objects行的匹配将以相同的方式发生。无法对一个 table 启用监视,而对另一 table 则无法启用。但是,每个 table 都是单独检测的。