为非索引列创建和管理直方图
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 会短暂持有元数据锁;更新直方图不会改变表统计信息(索引基数)。