MySQL服务器能够维护语句摘要信息。摘要过程将每个SQL语句转换为规范化形式(语句摘要),并从规范化结果计算SHA-256哈希值(摘要哈希值)。标准化允许对相似的语句进行分组和汇总,以公开有关服务器正在执行的语句类型以及它们出现的频率的信息。对于每个摘要,生成摘要的代表性语句都存储为示例。本节描述语句摘要和采样是如何发生的,以及它们如何有用。
无论性能模式是否可用,解析器都会进行摘要,以便其他特性(如MySQL Enterprise Firewall和查询重写插件)可以访问语句摘要。
当解析器接收到一条SQL语句时,如果需要该摘要,它会计算一个语句摘要,如果以下任何条件为真,则为真:
启用了性能模式摘要插装
MySQL企业防火墙已启用
启用查询重写插件
类也使用该解析器STATEMENT_DIGEST_TEXT ()
而且STATEMENT_DIGEST ()
函数,应用程序可以调用它们分别从SQL语句计算规范化的语句摘要和摘要哈希值。
的max_digest_length
系统变量值确定每个会话可用于计算规范化语句摘要的最大字节数。一旦在摘要计算期间使用了这个空间量,就会发生截断:不再收集已解析语句中的任何标记或将其计算到摘要值中。只有在经过解析的令牌的多个字节产生相同的规范化语句摘要之后才存在差异的语句,并且在进行比较或聚合以进行摘要统计时被认为是相同的。
设置max_digest_length
系统变量为零将禁用摘要生产,这也将禁用需要摘要的服务器功能。
在计算了规范化语句之后,将从中计算SHA-256哈希值。此外:
如果启用了MySQL企业防火墙,它将被调用,并且计算出来的摘要对它可用。
如果任何查询重写插件被启用,它将被调用,并且语句摘要和摘要值对它可用。
如果性能模式启用了摘要插装,它将生成规范化语句摘要的副本,并分配最大的
performance_schema_max_digest_length
字节。因此,如果performance_schema_max_digest_length
小于max_digest_length
,副本相对于原件被截断。规范化语句摘要的副本存储在适当的Performance Schema表中,以及从原始规范化语句计算的SHA-256哈希值。(如果性能模式相对于原始语句截断了规范化语句摘要的副本,则不会重新计算SHA-256哈希值。)
语句规范化将语句文本转换为更标准化的摘要字符串表示,保留一般语句结构,同时删除对结构不重要的信息:
对象标识符(如数据库和表名)被保留。
文字值被转换为参数标记。规范化语句不保留姓名、密码、日期等信息。
注释被删除,空白被调整。
考虑一下这些陈述:
SELECT * FROM customer_id=10且订单数量为>的订单
为了规范化这些语句,解析器将数据值替换为吗?
并调整空白。这两个语句产生相同的规范化形式,因此被考虑”相同的”:
SELECT * FROM order WHERE customer_id = ?和量> ?
规范化语句包含更少的信息,但仍然代表原始语句。具有不同数据值的其他类似语句具有相同的规范化形式。
现在考虑这些陈述:
SELECT * FROM customer_id = 1000的客户
在这种情况下,规范化语句因对象标识符不同而不同:
SELECT * FROM customer WHERE customer_id = ?SELECT * FROM order WHERE customer_id = ?
如果规范化生成的语句超出了摘要缓冲区中的可用空间(由max_digest_length
)时,会出现截断,文本以”...”.的后面出现的部分不同的长规范化语句”...”被认为是一样的。考虑一下这些陈述:
SELECT * FROM mytable WHERE cola = 10 AND colc = 20
如果截止时间刚好在和
,这两个语句都有这样的规范化形式:
SELECT * FROM mytable WHERE cola = ?和…
在这种情况下,第二个列名中的差值将丢失,两个语句被认为是相同的。
在性能模式中,语句摘要包含以下元素:
一个
statements_digest
消费者在setup_consumers
表控制性能模式是否维护摘要信息。看到语句摘要消费者.语句事件表(
events_statements_current
,events_statements_history
,events_statements_history_long
)有列用于存储规范化语句摘要和相应的摘要SHA-256哈希值:DIGEST_TEXT
是规范化语句摘要的文本。这是原始规范化语句的副本,计算的最大值为max_digest_length
字节,必要时进一步截断performance_schema_max_digest_length
字节。消化
是从原始规范化语句计算出来的摘要SHA-256哈希值。
的
events_statements_summary_by_digest
汇总表提供聚合的语句摘要信息。该表聚合了每个语句的信息SCHEMA_NAME
而且消化
组合。性能模式使用SHA-256哈希值进行聚合,因为它们计算速度快,并且具有有利的统计分布,可以最大限度地减少冲突。看到第27.12.20.3节“报表汇总表”.
一些性能表有一个列,存储原始SQL语句,从中计算摘要:
的
SQL_TEXT
的列events_statements_current
,events_statements_history
,events_statements_history_long
语句事件表。的
QUERY_SAMPLE_TEXT
的列events_statements_summary_by_digest
汇总表。
默认情况下,语句显示的最大可用空间为1024字节。若要更改此值,请设置performance_schema_max_sql_text_length
服务器启动时的系统变量。更改将影响刚刚命名的所有列所需的存储。
的performance_schema_max_digest_length
system变量决定在性能模式中每个语句可用来存储摘要值的最大字节数。然而,由于语句元素(如关键字和文字值)的内部编码,语句摘要的显示长度可能比可用的缓冲区大小要长。因此,从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_max_digest_length
设置不是每个会话,而是每个语句,并且一个会话可以存储多个语句events_statements_history
表格该表中的典型语句数是每个会话10条,因此每个会话消耗的内存是performance_schema_max_digest_length
值,对于这个表。
此外,还有许多全局收集的语句(和摘要),最显著的是events_statements_history_long
表格同样的,N
存储的语句消耗N
属性所表示的内存performance_schema_max_digest_length
价值。
要评估用于SQL语句存储和摘要计算的内存量,请使用显示引擎performance_schema状态
声明或监测这些文书:
SELECT NAME FROM performance_schemasetup_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。令牌| |内存/performance_schema/events_statements_summary_by_digest。令牌| | memory/performance_schema/events_statements_history_long。令牌 | +----------------------------------------------------------------------+
性能模式使用语句采样来收集产生中每个摘要值的代表性语句events_statements_summary_by_digest
表格这些列存储示例语句信息:QUERY_SAMPLE_TEXT
(声明文本),QUERY_SAMPLE_SEEN
(当该声明被看到时),以及QUERY_SAMPLE_TIMER_WAIT
(语句等待或执行时间)。每次选择一个示例语句时,性能模式都会更新所有三列。
插入新表行时,生成行摘要值的语句将存储为与摘要关联的当前示例语句。此后,当服务器看到具有相同摘要值的其他语句时,它决定是否使用新语句替换当前示例语句(即是否重新采样)。重采样策略基于当前样本语句和新语句的比较等待时间,也可以基于当前样本语句的年龄:
基于等待时间的重新采样:如果新语句的等待时间大于当前示例语句的等待时间,则它将成为当前示例语句。
基于年龄的重采样:如果
performance_schema_max_digest_sample_age
如果系统变量的值大于0,并且当前示例语句的运行时间超过0秒,则考虑当前语句”太老了”新的语句替换了它。即使新语句的等待时间小于当前示例语句的等待时间,也会发生这种情况。
默认情况下,performance_schema_max_digest_sample_age
是60秒(1分钟)。更改示例语句的速度”到期”由于年龄,增加或减少的价值。如果要禁用重采样策略中基于年龄的部分,请设置performance_schema_max_digest_sample_age
为0。