本文介绍统计信息的作用与分类,自动收集统计信息的机制,手动收集统计信息的方法,以及如何查看统计信息。
功能介绍
查询优化器(Query Optimizer)将查询转换为执行计划,并交给执行引擎去执行。执行计划的质量会影响查询的性能。统计信息作为查询优化器的输入,可以帮助查询优化器生成高质量的执行计划。
AnalyticDB MySQL版提供自动收集统计信息功能。该功能默认开启。在运维时间内AnalyticDB MySQL版会全量收集基础统计信息和直方图,如果需要收集统计信息的列太多,可能需要多天时间才能完成统计信息的全量收集。在运维时间外AnalyticDB MySQL版定时自动增量收集基础统计信息。通过INSERT OVERWRITE INTO
批量导入方式,数据导入完成后会立即自动收集基础统计信息。通过INSERT INTO
、REPLACE INTO
等实时导入方式导入数据,需要等到运维时间,或者Build完成后的增量收集周期时间触发增量收集任务,建议您在导入数据后手动收集一次基础统计信息。
您也可以关闭自动收集统计信息的功能,手动执行ANALYZE TABLE
收集统计信息。详细信息,请参见手动收集统计信息。
AnalyticDB MySQL版自动收集统计信息功能仅管理内表,不管理外表。
AnalyticDB MySQL版手动收集统计信息功能既可以管理内表,也可以管理外表。
注意事项
统计信息分类与选择
AnalyticDB MySQL版统计信息分为两类:基础统计信息(BASIC)和直方图(HISTOGRAM)。
基础统计信息
基础统计信息包含列的最大值、最小值、平均长度(单位:字节)、不同值的个数、NULL值比例等。AnalyticDB MySQL的基础统计信息支持全量收集,也支持自动增量收集。默认为自动增量收集。
- 不参与过滤和关联运算的列。
- 数据分布比较均匀的列,如主键列。
直方图
根据表的基础统计信息,将一段区间内的数据再次划分进一个桶形成直方图。直方图的每个桶描述了一段区间内的数据特征。
- Hybrid Histogram,由等高直方图变形而来,能够更好地描述热点值。
- Frequency Histogram,适用于不同值个数较少的列,每个值会对应一个桶。
适用场景:数据分布不均匀且参与过滤和关联运算的列。如果数据分布均匀,那么在过滤和关联运算场景下,基础统计信息可以代替直方图。
直方图只支持全量收集,相对基础统计信息能更准确地反映表的统计信息。在表很多的场景下,如果所有列都收集直方图,会使缓存命中率下降。直方图会占用更多的统计信息缓存空间,成本会高于基础统计信息的成本。默认的统计信息缓存空间能缓存约2万列直方图或200万列基础统计信息。
自动收集统计信息
开启或关闭自动收集统计信息的功能
SET adb_config O_CBO_AUTONOMOUS_STATS_ENABLED = [false|true];
设置运维时间
SET adb_config O_CBO_MAINTENANCE_WINDOW_DURATION = [04:00-05:00];
设置收集统计信息的数据量阈值
SET adb_config O_CBO_MAINTENANCE_WINDOW_COLLECTOR_ROW_LIMIT = 10000;
开启或关闭收集统计信息的负载限制
SET adb_config O_CBO_AUTONOMOUS_STATS_SCAN_RATE_LIMIT_ENABLED = [false|true];
在指定资源组收集统计信息
SET adb_config O_CBO_AUTONOMOUS_STATS_ACCOUNT = [user_name];
设置列的过期比例
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] | 否 | 指定统计信息的类型,取值:
|
ON column_name[,...] | 否 | 指定需要收集统计信息的列。如果不指定列,则会收集该表所有列的统计信息。 |
示例
- 收集
adb_demo.customer
表所有列的基础统计信息。可以选择以下任意一种方式:ANALYZE TABLE adb_demo.customer;
ANALYZE TABLE adb_demo.customer UPDATE BASIC;
- 收集
adb_demo.customer
表customer_id
列的基础统计信息。ANALYZE TABLE adb_demo.customer UPDATE BASIC ON customer_id;
- 收集
adb_demo.customer
表customer_id
和login_time
列的直方图信息。ANALYZE TABLE adb_demo.customer UPDATE HISTOGRAM ON customer_id,login_time;
查看统计信息
INFORMATION_SCHEMA
查看统计信息。- 执行以下命令,查看表级统计信息:
SELECT * FROM INFORMATION_SCHEMA.TABLE_STATISTICS;
- 执行以下命令,查看列级统计信息:
SELECT * FROM INFORMATION_SCHEMA.COLUMN_STATISTICS;
常见问题与解决方案
在使用统计信息功能过程中,您可能遇到一些问题。详情请参见统计信息FAQ。