这是一个很值得深入学习的主题,下面我为你系统地总结一下 《MySQL 8.0 JSON 功能增强与直方图——开发者与 DBA 的福音》 的核心内容与应用解析👇


🧩 一、背景:MySQL 8.0 的重大特性升级

MySQL 8.0 不仅仅是一个性能优化版本,更是一次数据表达与智能优化能力的跃升
其中两大特性尤其引人注目:

  1. JSON 功能增强(JSON Function Enhancements)
  2. 直方图(Histograms)统计信息机制

这两者一个提升了开发者的数据灵活性,一个强化了DBA 的查询优化能力,共同提升 MySQL 的智能化水平。


📘 二、JSON 功能增强:让 MySQL 更像 NoSQL

MySQL 在 5.7 就引入了 JSON 数据类型,但 8.0 做了革命性增强。

✴️ 1. JSON 新函数

功能类别函数名说明
元素提取JSON_EXTRACT()提取 JSON 字段内容
更新与插入JSON_SET(), JSON_INSERT(), JSON_REPLACE()修改 JSON 字段内的值
路径删除JSON_REMOVE()删除指定路径
合并操作JSON_MERGE_PATCH(), JSON_MERGE_PRESERVE()合并多个 JSON 文档
类型判断JSON_TYPE()返回字段类型
长度统计JSON_LENGTH()获取 JSON 对象或数组长度

✴️ 2. 新增索引支持:Functional Index

你可以为 JSON 内部的键建立函数索引

CREATE TABLE users (
  info JSON,
  INDEX idx_name ((JSON_UNQUOTE(JSON_EXTRACT(info, '$.name'))))
);

这使得:

SELECT * FROM users WHERE JSON_UNQUOTE(JSON_EXTRACT(info, '$.name')) = '阿杰';

可以走索引,性能大幅提升。


📊 三、直方图(Histograms):优化器的“X光眼”

MySQL 优化器在生成执行计划时,需要知道数据分布
而传统统计信息只保存平均值,不足以描述“非均匀分布”的情况。

✴️ 1. 两种直方图类型

类型名称特点
等宽直方图EQUI_WIDTH将值范围划分为等宽区间
等高直方图EQUI_HEIGHT每个区间包含相同数量的行,更精确

✴️ 2. 创建直方图

ANALYZE TABLE users UPDATE HISTOGRAM ON age WITH 10 BUCKETS;

删除直方图:

ANALYZE TABLE users DROP HISTOGRAM ON age;

查看直方图:

SELECT * FROM INFORMATION_SCHEMA.COLUMN_STATISTICS;

✴️ 3. 优势

  • 提高优化器选择索引的准确率
  • 减少查询计划误判导致的全表扫描
  • 对高偏态(skewed)数据特别有效

🧠 四、开发者与 DBA 的双重收益

角色受益点
开发者JSON 数据更灵活,支持结构化 + 非结构化混合存储
DBA直方图辅助优化器生成更精准执行计划,降低性能瓶颈

⚙️ 五、实战案例:JSON + 直方图联用

CREATE TABLE orders (
  id INT AUTO_INCREMENT PRIMARY KEY,
  data JSON,
  INDEX idx_status ((JSON_UNQUOTE(JSON_EXTRACT(data, '$.status'))))
);

INSERT INTO orders (data)
VALUES ('{"status": "completed", "amount": 500}'),
       ('{"status": "pending", "amount": 200}'),
       ('{"status": "completed", "amount": 800}');

-- 建立直方图优化分布
ANALYZE TABLE orders UPDATE HISTOGRAM ON (JSON_UNQUOTE(JSON_EXTRACT(data, '$.status'))) WITH 5 BUCKETS;

查询时优化器会智能判断 status 分布,选择最优索引路径。


🔗 六、参考资料与出站链接