MySQL服务器能够维护语句摘要信息。消化过程将每个SQL语句转换为规范化形式(语句摘要),并从规范化结果计算MD5哈希值(摘要哈希值)。规范化允许对相似的语句进行分组和汇总,以公开有关服务器正在执行的语句类型以及它们出现的频率的信息。本节描述语句消化是如何发生的,以及它是如何有用的。
无论Performance Schema是否可用,解析都会在解析器中进行,这样其他服务器组件(如MySQL Enterprise Firewall和查询重写插件)就可以访问语句摘要。
当解析器接收到一条SQL语句时,如果需要该摘要,它会计算一个语句摘要,如果以下条件为真,则为真:
启用了性能模式摘要插装
MySQL企业防火墙已启用
启用了查询重写插件
的max_digest_length
系统变量值确定每个会话可用于计算规范化语句摘要的最大字节数。一旦在摘要计算期间使用了这一数量的空间,就会发生截断:不再收集解析语句中的任何标记或将其计算到摘要值中。只有在经过解析的令牌的多个字节之后才不同的语句产生相同的规范化语句摘要,并且在进行比较或聚合摘要统计时被认为是相同的。
设置max_digest_length
系统变量为零将禁用摘要生产,这也将禁用需要摘要的服务器功能。
在计算规范化语句之后,将从中计算MD5哈希值。此外:
如果启用了MySQL Enterprise Firewall,就会调用它,计算出来的摘要对它可用。
如果启用了任何查询重写插件,它将被调用,语句摘要和摘要值将对其可用。
如果性能模式启用了摘要插装,它将生成规范化语句摘要的副本,分配的最大值为
performance_schema_max_digest_length
字节。因此,如果performance_schema_max_digest_length
小于max_digest_length
,副本相对于原件被截断。规范化语句摘要的副本存储在适当的Performance Schema表中,以及从原始规范化语句计算的MD5哈希值。(如果性能模式相对于原始语句截断了规范化语句摘要的副本,则不会重新计算MD5哈希值。)
语句规范化将语句文本转换为更标准化的摘要字符串表示形式,在保留一般语句结构的同时删除对结构不重要的信息:
对象标识符(如数据库和表名)将被保留。
文字值被转换为参数标记。规范化语句不保留姓名、密码、日期等信息。
注释被删除,空格被调整。
考虑这些语句:
SELECT * FROM orders WHERE customer_id=10 AND quantity>20
为了规范化这些语句,解析器将数据值替换为?
和调整的空白。这两个表述产生相同的规范化形式,因此被考虑”相同的”:
SELECT * FROM orders WHERE customer_id = ?和数量> ?
规范化语句包含更少的信息,但仍然代表原始语句。其他具有不同数据值的类似语句具有相同的规范化形式。
现在考虑一下这些陈述:
SELECT * FROM customers WHERE customer_id = 1000
在这种情况下,由于对象标识符不同,规范化语句也不同:
SELECT * FROM customers WHERE customer_id = ?SELECT * FROM orders WHERE customer_id = ?
如果规范化产生的语句超出了摘要缓冲区中的可用空间(由max_digest_length
),出现截断,文本以”...”.的部分不同的长规范化语句”...”被认为是一样的。考虑这些语句:
从可乐值为10且可乐值为20的表中查询*
如果截止时间正好在和
,两个语句都有规范化形式:
SELECT * FROM mytable WHERE cola = ?和…
在这种情况下,第二个列名中的差值丢失,两个语句被认为是相同的。
在性能模式中,语句消化包含以下元素:
一个
statements_digest
消费者在setup_consumers
表控制性能模式是否维护摘要信息。看到声明消化消费者.语句事件表(
events_statements_current
,events_statements_history
,events_statements_history_long
)有列用于存储规范化语句摘要和相应的摘要MD5哈希值:DIGEST_TEXT
规范化语句摘要的文本。这是原始规范化语句的副本,计算的最大值为max_digest_length
字节,必要时进一步截断performance_schema_max_digest_length
字节。消化
是由原始规范化语句计算的摘要MD5哈希值。
的
events_statements_summary_by_digest
汇总表提供聚合的语句摘要信息。此表聚合语句的信息SCHEMA_NAME
而且消化
组合。性能模式使用MD5哈希值进行聚合,因为它们计算速度快,并且有一个有利的统计分布,可以最小化冲突。看到第25.12.15.3节“报表汇总表”.
语句事件表也具有SQL_TEXT
列,其中包含原始SQL语句。默认情况下,语句显示的最大可用空间是1024字节。要更改此值,请设置performance_schema_max_sql_text_length
服务器启动时的系统变量。
的performance_schema_max_digest_length
系统变量决定了每个语句在性能架构中用于摘要值存储的最大字节数。但是,由于关键字和文字值等语句元素的内部编码,语句摘要的显示长度可能比可用的缓冲区大小要长。因此,从DIGEST_TEXT
语句事件表的列可能出现超过performance_schema_max_digest_length
价值。
的events_statements_summary_by_digest
汇总表提供由服务器执行的语句的概要。它显示了应用程序正在执行什么类型的语句以及执行的频率。应用程序开发人员可以将此信息与表中的其他信息一起使用,以评估应用程序的性能特征。例如,显示等待时间、锁定时间或索引使用的表列可能突出显示效率低下的查询类型。这让开发人员了解到应用程序的哪些部分需要注意。
的events_statements_summary_by_digest
汇总表的大小是固定的。默认情况下,性能模式估计在启动时使用的大小。要显式指定表大小,请设置performance_schema_digests_size
服务器启动时的系统变量。如果表已满,则性能模式将具有的语句分组SCHEMA_NAME
而且消化
的特殊行中表中的现有值不匹配的值SCHEMA_NAME
而且消化
设置为零
.这允许计算所有的报表。但是,如果特殊行在执行的语句中占很大比例,则可能需要通过增加汇总表的大小来增加汇总表的大小performance_schema_digests_size
.
对于生成非常长的语句的应用程序,只在末尾有差异,增加max_digest_length
支持计算摘要,以区分将聚合到同一摘要的语句。相反,减少max_digest_length
导致服务器用于摘要存储的内存减少,但增加了较长的语句聚合到同一摘要的可能性。管理员应该记住,较大的值会导致相应的内存需求增加,特别是对于涉及大量同时会话的工作负载(服务器分配max_digest_length
每个会话字节)。
如前所述,解析器计算的规范化语句摘要被限制为最大max_digest_length
而存储在性能模式中的规范化语句摘要使用performance_schema_max_digest_length
字节。的相对值适用于以下内存使用注意事项max_digest_length
而且performance_schema_max_digest_length
:
如果
max_digest_length
小于performance_schema_max_digest_length
:性能架构以外的服务器组件使用规范化语句摘要,其占用高达
max_digest_length
字节。性能模式不进一步截断它所存储的规范化语句摘要,而是分配更多的内存
max_digest_length
每个摘要的字节数,这是不必要的。
如果
max_digest_length
=performance_schema_max_digest_length
:性能架构以外的服务器组件使用规范化语句摘要,其占用高达
max_digest_length
字节。性能模式不进一步截断它所存储的规范化语句摘要,并分配与
max_digest_length
字节/消化。
如果
max_digest_length
大于performance_schema_max_digest_length
:性能架构以外的服务器组件使用规范化语句摘要,其占用高达
max_digest_length
字节。性能模式进一步截断它所存储的规范化语句摘要,并分配比
max_digest_length
字节/消化。
因为性能架构语句事件表可能存储许多摘要、设置performance_schema_max_digest_length
小于max_digest_length
使管理员能够平衡这些因素:
需要为性能模式之外的服务器组件提供长规格化语句摘要
许多并发会话,每个会话分配摘要计算内存
在存储许多语句摘要时,需要限制Performance Schema语句事件表的内存消耗
的performance_schema_max_digest_length
设置不是每个会话,而是每个语句,并且一个会话可以在events_statements_history
表格表中典型的语句数量是每个会话10条,因此每个会话消耗10倍于performance_schema_max_digest_length
值,仅针对这个表。
此外,还有许多全局收集的语句(和摘要),最显著的是events_statements_history_long
表格同样的,N
报表存储消耗N
的指示的内存乘以performance_schema_max_digest_length
价值。
要评估用于SQL语句存储和摘要计算的内存量,请使用显示引擎performance_schema状态
声明或监测这些工具:
SELECT NAME FROM performance_schema。setup_instruments WHERE NAME LIKE '%.sqltext';+------------------------------------------------------------------+ | 的名字 | +------------------------------------------------------------------+ | 内存/ performance_schema / events_statements_history。Sqltext | | memory/performance_schema/events_statements_current。Sqltext | | memory/performance_schema/events_statements_history_long。sqltext | +------------------------------------------------------------------+ mysql >从performance_schema选择名称。setup_instruments WHERE NAME LIKE 'memory/performance_schema/%.tokens';+----------------------------------------------------------------------+ | 的名字 | +----------------------------------------------------------------------+ | 内存/ performance_schema / events_statements_history。令牌| | memory/performance_schema/events_statements_current。令牌| | memory/performance_schema/events_statements_summary_by_digest。令牌| | memory/performance_schema/events_statements_history_long。令牌 | +----------------------------------------------------------------------+