MySQL 8.0 直方图不会自动创建,必须显式执行 UPDATE HISTOGRAM;ANALYZE TABLE 仅更新基础统计信息,不生成直方图;因其采集开销大、需按需启用,且仅在列分布倾斜、高频过滤且无高效索引时才有效。

MySQL 8.0 的直方图不会自动创建,哪怕你启用了 innodb_stats_persistent 或跑过 ANALYZE TABLE,它也默认不生成——必须显式调用 UPDATE HISTOGRAM 才会生效。
直方图不是 ANALYZE TABLE 的默认行为
执行 ANALYZE TABLE t 只会更新索引基数(Cardinality)、行数估算等基础统计信息,不会碰直方图。这是设计使然,不是 bug。想建直方图,必须加 UPDATE HISTOGRAM ON column_name 子句。
- 错误写法:
ANALYZE TABLE orders→ 直方图字段仍为空 - 正确写法:
ANALYZE TABLE orders UPDATE HISTOGRAM ON status WITH 100 BUCKETS - 验证是否成功:
SELECT HISTOGRAM FROM information_schema.COLUMN_STATISTICS WHERE TABLE_NAME = 'orders' AND COLUMN_NAME = 'status',返回非空 JSON 才算建好
为什么不能默认开启?
直方图采集有真实开销:它要扫描列值、排序、分桶、序列化成 JSON 存入 mysql.column_statistics。对大表(尤其 TEXT/BLOB 列或高基数列),一次直方图构建可能耗时数秒甚至分钟,且占用额外磁盘空间。MySQL 选择“按需启用”,避免用户在未评估必要性时被拖慢 DDL 或后台任务。
- 默认桶数是 100,但高基数列(如
user_id)用SINGLE_VALUE类型会爆内存,得切回TARGET(等高)类型 -
HISTOGRAM字段存的是压缩 JSON,但反复更新仍会增大系统表体积,长期不清理可能影响information_schema查询延迟 - 如果列上已有高效索引,直方图基本没用——优化器优先走索引统计,根本不会读直方图
哪些场景下手动收集反而有害?
直方图只在特定条件下起作用,盲目添加可能误导优化器,甚至让执行计划变差。
- 列分布均匀(比如
created_at时间戳),直方图提供的信息和默认均匀假设差别极小,纯属冗余 - WHERE 条件里用了函数包装,如
WHERE YEAR(order_date) = 2024,直方图对order_date列完全失效 - 该列是 JOIN 或 GROUP BY 的主键/外键列,直方图不参与这些环节的基数估算,白建
- 表刚批量导入数据,但
ANALYZE TABLE ... UPDATE HISTOGRAM还没跑,此时EXPLAIN显示的rows值严重偏离实际,别急着建直方图——先补基础统计
真正要动手建直方图前,先确认三件事:列是否严重倾斜、是否出现在高频 WHERE 中、当前有没有可用索引。漏掉任何一条,操作就大概率变成“给不需要刹车的车换刹车片”。


















