本文介绍统计信息的作用与分类,自动收集统计信息的机制,手动收集统计信息的方法,以及如何查看统计信息。

功能介绍

查询优化器(Query Optimizer)将查询转换为执行计划,并交给执行引擎去执行。执行计划的质量会影响查询的性能。统计信息作为查询优化器的输入,可以帮助查询优化器生成高质量的执行计划。

AnalyticDB MySQL版提供自动收集统计信息功能。该功能默认开启。在运维时间内AnalyticDB MySQL版会全量收集基础统计信息和直方图,如果需要收集统计信息的列太多,可能需要多天时间才能完成统计信息的全量收集。在运维时间外AnalyticDB MySQL版定时自动增量收集基础统计信息。通过INSERT OVERWRITE INTO批量导入方式,数据导入完成后会立即自动收集基础统计信息。通过INSERT INTOREPLACE INTO等实时导入方式导入数据,需要等到运维时间,或者Build完成后的增量收集周期时间触发增量收集任务,建议您在导入数据后手动收集一次基础统计信息。

您也可以关闭自动收集统计信息的功能,手动执行ANALYZE TABLE收集统计信息。详细信息,请参见手动收集统计信息

AnalyticDB MySQL版自动收集统计信息功能仅管理内表,不管理外表。

AnalyticDB MySQL版手动收集统计信息功能既可以管理内表,也可以管理外表。

注意事项

湖仓版(3.0)数仓版(3.0)集群都支持统计信息功能,但集群内核版本需为3.1.6.1及以上。
说明

统计信息分类与选择

AnalyticDB MySQL版统计信息分为两类:基础统计信息(BASIC)和直方图(HISTOGRAM)。

基础统计信息

基础统计信息包含列的最大值、最小值、平均长度(单位:字节)、不同值的个数、NULL值比例等。AnalyticDB MySQL的基础统计信息支持全量收集,也支持自动增量收集。默认为自动增量收集。

适用场景:
  • 不参与过滤和关联运算的列。
  • 数据分布比较均匀的列,如主键列。

直方图

根据表的基础统计信息,将一段区间内的数据再次划分进一个桶形成直方图。直方图的每个桶描述了一段区间内的数据特征。

分类:
  • Hybrid Histogram,由等高直方图变形而来,能够更好地描述热点值。
  • Frequency Histogram,适用于不同值个数较少的列,每个值会对应一个桶。
说明 AnalyticDB MySQL会自动为您选择合适的直方图。

适用场景:数据分布不均匀且参与过滤和关联运算的列。如果数据分布均匀,那么在过滤和关联运算场景下,基础统计信息可以代替直方图。

直方图只支持全量收集,相对基础统计信息能更准确地反映表的统计信息。在表很多的场景下,如果所有列都收集直方图,会使缓存命中率下降。直方图会占用更多的统计信息缓存空间,成本会高于基础统计信息的成本。默认的统计信息缓存空间能缓存约2万列直方图或200万列基础统计信息。

自动收集统计信息

开启或关闭自动收集统计信息的功能

自动收集统计信息的功能默认开启。您可以通过下列命令关闭或重新开启自动收集统计信息的功能。
SET adb_config O_CBO_AUTONOMOUS_STATS_ENABLED = [false|true];

设置运维时间

自动收集统计信息的运维时间默认为04:00~05:00。您可以通过下列命令修改运维时间,建议设置在业务低峰期。开始时间与结束时间的间隔最短不能小于1分钟,最长不能超过3小时。开始时间要早于结束时间。设置错误时,会使用默认时间。
说明 运维时间与集群当前时间所在时区保持一致。
SET adb_config O_CBO_MAINTENANCE_WINDOW_DURATION = [04:00-05:00];

设置收集统计信息的数据量阈值

全量收集统计信息时,默认跳过数据量超过5000000000行(50亿行)的表,减少对集群性能的影响。您可以通过下列命令调整数据量的限制,主动管理超大表。
SET adb_config O_CBO_MAINTENANCE_WINDOW_COLLECTOR_ROW_LIMIT = 10000;

开启或关闭收集统计信息的负载限制

运维时间内,AnalyticDB MySQL会限制自动收集统计信息时的负载,减少扫描表时IO资源占用。默认值true (开启限速)。如果运维时间内资源空闲,可以关闭负载限制以加快统计信息更新。
SET adb_config O_CBO_AUTONOMOUS_STATS_SCAN_RATE_LIMIT_ENABLED = [false|true];

在指定资源组收集统计信息

自动收集统计信息默认使用系统账号执行命令。如果希望在指定资源组执行自动收集统计信息的命令,可以通过下列命令指定数据库账号。指定数据库账号后,AnalyticDB MySQL将在该数据库账号绑定的资源组中执行自动收集统计信息的命令。请确保该数据库账号拥有所有表所有列的查询权限,且已绑定资源组,绑定操作请参见新建资源组
SET adb_config O_CBO_AUTONOMOUS_STATS_ACCOUNT = [user_name];

设置列的过期比例

列的过期比例默认为0.1(10%)。当表的UPDATE、DELETE、INSERT或REPLACE等操作影响的行数相对于表的总行数的比例大于过期比例时,会判定该表的统计信息过期,AnalyticDB MySQL版会在运维时间内对过期的表的所有列重新收集统计信息。列的过期比例未超过设置的比例时,在运维时间内也不会自动收集统计信息。
SET adb_config O_CBO_STATS_EXPIRED_RATIO = 0.1;

手动收集统计信息

您可以手动执行ANALYZE TABLE收集统计信息。ANALYZE TABLE命令会扫描全表来收集统计信息,对于数据量大的表,建议在业务低峰期执行。

语法

ANALYZE TABLE [schema_name.]table_name [UPDATE [BASIC|HISTOGRAM]] [ON column_name[,...]]

参数

参数是否必选说明
schema_name数据库名称。
table_name表名。AnalyticDB MySQL将收集该表的统计信息。一个ANALYZE TABLE语句只能指定一个表,可以指定内表或外表。
UPDATE [BASIC|HISTOGRAM]指定统计信息的类型,取值:
  • BASIC(默认值):基础统计信息。
  • HISTOGRAM:直方图。
ON column_name[,...]指定需要收集统计信息的列。如果不指定列,则会收集该表所有列的统计信息。

示例

  • 收集adb_demo.customer表所有列的基础统计信息。可以选择以下任意一种方式:
    • ANALYZE TABLE adb_demo.customer;
    • ANALYZE TABLE adb_demo.customer UPDATE BASIC;
  • 收集adb_demo.customercustomer_id列的基础统计信息。
    ANALYZE TABLE adb_demo.customer UPDATE BASIC ON customer_id;
  • 收集adb_demo.customercustomer_idlogin_time列的直方图信息。
    ANALYZE TABLE adb_demo.customer UPDATE HISTOGRAM ON customer_id,login_time;

查看统计信息

统计信息以二进制形式存储在AnalyticDB MySQL内。您可以通过系统表INFORMATION_SCHEMA查看统计信息。
  • 执行以下命令,查看表级统计信息:
    SELECT * FROM INFORMATION_SCHEMA.TABLE_STATISTICS;
  • 执行以下命令,查看列级统计信息:
    SELECT * FROM INFORMATION_SCHEMA.COLUMN_STATISTICS;

常见问题与解决方案

在使用统计信息功能过程中,您可能遇到一些问题。详情请参见统计信息FAQ