DBAtlas · 数据库运维图谱

为非索引列创建和管理直方图

MySQL索引与统计信息

命令

ANALYZE TABLE shop.big UPDATE HISTOGRAM ON status WITH 64 BUCKETS;
-- 8.4+: histogram refreshed automatically as data changes
ANALYZE TABLE shop.big UPDATE HISTOGRAM ON status WITH 64 BUCKETS AUTO UPDATE;

SELECT SCHEMA_NAME, TABLE_NAME, COLUMN_NAME,
       HISTOGRAM->>'$."histogram-type"' AS type,
       JSON_LENGTH(HISTOGRAM->'$.buckets') AS buckets,
       HISTOGRAM->>'$."last-updated"' AS last_updated,
       HISTOGRAM->>'$."sampling-rate"' AS sampling_rate
FROM information_schema.COLUMN_STATISTICS;

ANALYZE TABLE shop.big DROP HISTOGRAM ON status;

作用

在数据字典中存储列的值分布(singleton 或 equi-height);优化器能正确估算非索引列上过滤条件的选择性,从而改善连接顺序和执行计划质量。

适用场景

EXPLAIN ANALYZE 在数据倾斜的列(如 status、type)上显示估算与实际行数差距很大,而又不宜添加索引时。

注意

在索引列上优化器使用 index dive,因此直方图通常不起作用(除非超过 eq_range_index_dive_limit)。在默认的 MANUAL 模式下,直方图不会随数据变化而刷新;请定期调度 ANALYZE ... UPDATE HISTOGRAM。大表按 histogram_generation_max_mem_size 进行采样(sampling-rate < 1)。ANALYZE TABLE 会短暂持有元数据锁;更新直方图不会改变表统计信息(索引基数)。

在 DBAtlas 中打开 →

相关内容