• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • 性能架构语句摘要和采样

    MySQL服务器能够维护语句摘要信息。摘要处理将每个SQL语句转换为规范化形式(语句摘要),并根据规范化结果计算SHA-256哈希值(摘要哈希值)。规范化允许对相似的语句进行分组和汇总,以公开有关服务器正在执行的语句类型及其发生频率的信息。对于每个摘要,产生摘要的代表性语句将作为样本存储。本节介绍如何进行语句摘要和采样以及它们如何有用。

    不管性能模式是否可用,摘要都会在解析器中发生,以便其他服务器组件(例如查询重写插件)可以访问语句摘要。

    • 陈述文摘一般概念
    • 性能模式中的语句摘要
    • 语句摘要存储器的使用
    • 陈述抽样

    陈述文摘一般概念

    解析器收到一条SQL语句时,如果需要该摘要,它将计算一条语句摘要,如果满足以下任一条件,则为true:

    • 启用性能架构摘要检测
    • 查询重写插件已启用

    解析器也由STATEMENT_DIGEST_TEXT()STATEMENT_DIGEST()函数使用,应用程序可以调用该函数分别从SQL语句计算标准化的语句摘要和摘要哈希值。

    所述max_digest_length系统变量值确定归一化的语句摘要的计算每个会话中可用的字节的最大数量。一旦在摘要计算过程中使用了一定数量的空间,就会发生截断:不再收集来自已解析语句的其他标记,也不会将其计入其摘要值。只有在解析的令牌的多个字节产生相同的规范化语句摘要之后才不同的语句,如果比较或汇总摘要统计信息,这些语句将被视为相同。

    在计算完标准化的语句后,将根据该语句计算SHA-256哈希值。此外:

    • 如果启用了任何查询重写插件,则将调用它,并且语句摘要和摘要值可供使用。
    • 如果性能模式启用了摘要检测,它将复制规范化语句摘要,performance_schema_max_digest_length并为其分配最大字节数。因此,如果performance_schema_max_digest_length小于max_digest_length,则副本相对于原始副本将被截断。规范化语句摘要的副本与从原始规范化语句计算得出的SHA-256哈希值一起存储在适当的Performance Schema表中。(如果性能架构相对于原始版本截断了其规范化语句摘要的副本,则它不会重新计算SHA-256哈希值。)

    语句规范化将语句文本转换为更标准化的摘要字符串表示形式,该表示形式保留了常规的语句结构,同时删除了对该结构不重要的信息:

    • 保留对象标识符,例如数据库和表名。
    • 文字值将转换为参数标记。规范化的语句不保留诸如名称,密码,日期等信息。
    • 删除注释并调整空白。

    考虑以下语句:

    SELECT * FROM orders WHERE customer_id=10 AND quantity>20
    SELECT * FROM orders WHERE customer_id = 20 AND quantity > 100
    

    为了规范化这些语句,解析器用替换数据值?并调整空格。这两个语句产生相同的规范化形式,因此被视为“相同”:

    SELECT * FROM orders WHERE customer_id = ? AND quantity > ?
    

    规范化语句包含的信息较少,但仍代表原始语句。具有不同数据值的其他类似语句具有相同的规范化形式。

    现在考虑以下语句:

    SELECT * FROM customers WHERE customer_id = 1000
    SELECT * FROM orders WHERE customer_id = 1000
    

    在这种情况下,归一化的语句不同,因为对象标识符不同:

    SELECT * FROM customers WHERE customer_id = ?
    SELECT * FROM orders WHERE customer_id = ?
    

    如果规范化产生的语句超出摘要缓冲区中的可用空间(由确定max_digest_length),则会发生截断并且文本以“...”结尾。仅在“...”之后出现的部分不同的长规范化语句被认为是相同的。考虑以下语句:

    SELECT * FROM mytable WHERE cola = 10 AND colb = 20
    SELECT * FROM mytable WHERE cola = 10 AND colc = 20
    

    如果截断恰好在之后AND,则两个语句都具有以下标准化形式:

    SELECT * FROM mytable WHERE cola = ? AND ...
    

    在这种情况下,第二列名称中的差异将丢失,并且两个语句都被视为相同。

    性能模式中的语句摘要

    在性能模式中,语句摘要涉及以下组件:

    • 表中的statements_digest使用者setup_consumers控制性能模式是否维护摘要信息。请参阅对帐单摘要消费者。
    • 语句事件表(events_statements_currentevents_statements_historyevents_statements_history_long)具有用于存储规范化语句摘要和相应摘要SHA-256哈希值的列:

      • DIGEST_TEXT是规范化语句摘要的文本。这是原始规范化语句的副本,该语句被计算为最大max_digest_length字节数,并在必要时进一步被截断为performance_schema_max_digest_length字节数。
      • DIGEST是根据原始规范化语句计算的摘要SHA-256哈希值。

      请参见“性能架构语句事件表”。

    • events_statements_summary_by_digest汇总表提供汇总声明摘要信息。该表汇总了每个报表SCHEMA_NAMEDIGEST组合报表的信息。性能架构将SHA-256哈希值用于聚合,因为它们计算速度快并且具有有利的统计分布,从而最大程度地减少了冲突。请参见“语句摘要表”。

    某些性能表的一列存储用于计算摘要的原始SQL语句:

    • SQL_TEXT该列events_statements_currentevents_statements_historyevents_statements_history_long语句事件表。
    • 摘要表的QUERY_SAMPLE_TEXTevents_statements_summary_by_digest

    默认情况下,可用于语句显示的最大空间为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_NAMEDIGEST值与表中现有值不匹配的语句分组为SCHEMA_NAMEDIGEST设置为的特殊行NULL。这允许对所有语句进行计数。但是,如果特殊行占执行语句的很大一部分,则可能需要通过增加来增加摘要表的大小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语句事件表可能存储许多摘要,因此将其设置为performance_schema_max_digest_length小于max_digest_length可使管理员平衡这些因素:

    • 对于性能模式外部的服务器组件,需要具有较长的规范化语句摘要
    • 许多并发会话,每个会话都分配摘要计算内存
    • 存储许多语句摘要时,需要通过Performance Schema语句事件表来限制内存消耗

    performance_schema_max_digest_length设置不是针对每个会话,而是针对每个语句,一个会话可以在events_statements_history表中存储多个语句。该表中的典型语句数是每个会话10条,因此,仅对于此表,每个会话将消耗该performance_schema_max_digest_length值指示的内存的10倍。

    另外,全局收集了很多语句(和摘要),尤其是在events_statements_history_long表中。在这里,N存储的语句也会消耗值所N指示的内存的时间performance_schema_max_digest_length

    要评估用于SQL语句存储和摘要计算的内存量,请使用该SHOW ENGINE PERFORMANCE_SCHEMA STATUS语句或监视以下工具:

    mysql> SELECT NAME
           FROM performance_schema.setup_instruments
           WHERE NAME LIKE '%.sqltext';
    +------------------------------------------------------------------	+
    | NAME	|
    +------------------------------------------------------------------	+
    | memory/performance_schema/events_statements_history.sqltext	|
    | memory/performance_schema/events_statements_current.sqltext	|
    | memory/performance_schema/events_statements_history_long.sqltext	|
    +------------------------------------------------------------------	+
    
    mysql> SELECT NAME
           FROM performance_schema.setup_instruments
           WHERE NAME LIKE 'memory/performance_schema/%.tokens';
    +----------------------------------------------------------------------	+
    | NAME	|
    +----------------------------------------------------------------------	+
    | memory/performance_schema/events_statements_history.tokens	|
    | memory/performance_schema/events_statements_current.tokens	|
    | memory/performance_schema/events_statements_summary_by_digest.tokens	|
    | memory/performance_schema/events_statements_history_long.tokens	|
    +----------------------------------------------------------------------	+
    

    陈述抽样

    Performance Schema使用语句采样来收集产生events_statements_summary_by_digest表中每个摘要值的代表性语句。这些列存储示例语句信息:(语句QUERY_SAMPLE_TEXT文本),QUERY_SAMPLE_SEEN(看到语句时)和QUERY_SAMPLE_TIMER_WAIT(语句等待或执行时间)。每次选择示例语句时,性能架构都会更新所有三列。

    插入新表行时,将产生行摘要值的语句存储为与摘要关联的当前样本语句。此后,当服务器看到其他具有相同摘要值的语句时,它将确定是否使用新语句替换当前的样本语句(即是否重新采样)。重采样策略基于当前示例语句和新语句的比较等待时间,以及可选的当前示例语句的寿命:

    • 基于等待时间的重采样:如果新语句的等待时间的等待时间大于当前示例语句的等待时间,则它将成为当前示例语句。
    • 根据年龄进行重采样:如果performance_schema_max_digest_sample_age系统变量的值大于零,并且当前样本语句的存在时间超过了几秒钟,则当前语句被视为“过旧”,而新语句将其替换。即使新语句的等待时间小于当前示例语句的等待时间,也会发生这种情况。

    默认情况下performance_schema_max_digest_sample_age为60秒(1分钟)。要更改样本语句由于使用期限而“到期”的速度,请增加或减小该值。要禁用重采样策略的基于年龄的部分,请设置performance_schema_max_digest_sample_age为0。