登录
推荐 文章 Go 技术 课程 下载 专题 AI
首页 >  数据库 >  MySQL

MySQL 直方图怎样删除过期统计信息

来源:17golang原创

时间:2026-11-05 18:53:29 112浏览 收藏

MySQL 直方图过期时,不需要删除整张表的统计信息。直接对目标列执行 ANALYZE TABLE orders DROP HISTOGRAM ON amount; 即可;多个列可以放在同一条语句中。官方参考地址:https://dev.mysql.com/doc/refman/8.4/en/analyze-table.html。删除后,优化器不再使用这些列的直方图估算,但普通索引统计不会因为这条语句一起消失。

稳妥的处理顺序是:先查 COLUMN_STATISTICS 确认列上确实有直方图,再按列执行 DROP HISTOGRAM,最后根据返回状态和查询计划确认影响范围。
  • 删除对象:指定表中指定列的 histogram 统计。
  • 保留对象:同表其他列的直方图,以及普通索引的基数统计。
  • 核心语法:ANALYZE TABLE 表名 DROP HISTOGRAM ON 列名。

先分清直方图和普通索引统计

MySQL 的直方图保存在数据字典中,用户通过 INFORMATION_SCHEMA.COLUMN_STATISTICS 这个视图查看。它主要帮助优化器估算非索引列上与常量比较的选择性,例如范围、等值和 IN 条件。直方图是按列维护的,不能把“表上有索引统计”理解为“表上有直方图”。

删除前先缩小范围,避免凭感觉清理:

-- 只查看 orders.amount 当前是否有直方图
SELECT SCHEMA_NAME, TABLE_NAME, COLUMN_NAME, HISTOGRAM
FROM INFORMATION_SCHEMA.COLUMN_STATISTICS
WHERE SCHEMA_NAME = 'shop'
  AND TABLE_NAME = 'orders'
  AND COLUMN_NAME = 'amount';

如果能返回该列记录,说明它存在可管理的直方图;如果结果为空,可能是尚未创建、已经删除,或者当前账号看不到该对象。这个查询只查看直方图,不会列出 SHOW INDEX 里的普通索引统计。

MySQL 直方图与 COLUMN_STATISTICS 的列级对应关系说明图
图1:列级统计关系说明图,展示表、目标列与 COLUMN_STATISTICS 的对应范围,不是运行截图。

用 DROP HISTOGRAM 只删过期列

确定目标列后,把删除动作交给 ANALYZE TABLE 的直方图子句。它不是普通的表分析,也不是 DROP TABLE;语句中的表名只能指向一个表,列名可以写一个或多个。

-- 删除 amount 的过期直方图,其他列不受影响
ANALYZE TABLE `shop`.`orders`
  DROP HISTOGRAM ON `amount`;

-- 同时删除同一张表上两个指定列的直方图
ANALYZE TABLE `shop`.`orders`
  DROP HISTOGRAM ON `amount`, `status`;

返回结果中的 Op 通常是 histogram,成功时 Msg_type 为 status,消息会指向被移除的列。多列操作按列报告结果;某个列名不存在或不适合处理时,其他可处理列仍可能完成,不能只看客户端最后一行。

删除操作不会把表的索引、数据或列定义改掉。它只让优化器失去这份列分布摘要,因此在删除前应记录受影响查询,尤其是没有索引、依赖选择性估算的过滤条件。

MySQL DROP HISTOGRAM 删除指定列并保留其他统计对象的结构说明图
图2:删除范围说明图,突出 DROP HISTOGRAM 只作用于选中的列,并与索引统计保持边界。

删除后怎样判断处理方向

再次查询 COLUMN_STATISTICS,目标列的记录应不再出现;同表其他仍保留直方图的列可以继续返回。如果删除后执行计划变差,说明这份分布信息可能仍有价值,优先考虑重新生成而不是长期关闭:

-- 重新生成目标列的直方图,桶数按数据分布与内存预算决定
ANALYZE TABLE `shop`.`orders`
  UPDATE HISTOGRAM ON `amount` WITH 64 BUCKETS;

-- 删除后再次确认目标列已没有直方图记录
SELECT COLUMN_NAME
FROM INFORMATION_SCHEMA.COLUMN_STATISTICS
WHERE SCHEMA_NAME = 'shop'
  AND TABLE_NAME = 'orders';

UPDATE HISTOGRAM 适合统计仍然有用、只是旧了的场景;DROP HISTOGRAM 适合统计误导估算、暂时不想让优化器使用的场景。只为临时实验关闭 condition_fanout_filter 会影响更广的优化行为,不应替代列级清理。

常见边界与速查

现象应先判断什么处理建议
查询为空列上没有直方图,或账号无权看到核对库表列名和权限,不要重复删除
删除后计划变化过滤条件是否依赖该列分布估算对比 EXPLAIN,必要时重新 UPDATE
想清理整个表是否真的要移除每一列的直方图显式列出列名,避免范围过大
权限报错ANALYZE TABLE 需要相应表权限让管理员按最小权限授权后再操作

相关问题

普通 ANALYZE TABLE 会删除直方图吗?

不会。没有直方图子句的 ANALYZE TABLE 主要更新表和索引相关的键分布,已有直方图不会因此自动消失。

可以一次删除不同表的直方图吗?

不能用一条 DROP HISTOGRAM 子句跨多个表。每条语句只针对一个表,按表分别执行并分别查看返回结果。

删掉直方图会删掉索引吗?

不会。它只移除列直方图统计,不改变索引定义、表数据和列结构。

声明:本文转载于:17golang原创 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>