这是一个很值得深入学习的主题,下面我为你系统地总结一下 《MySQL 8.0 JSON 功能增强与直方图——开发者与 DBA 的福音》 的核心内容与应用解析👇
🧩 一、背景:MySQL 8.0 的重大特性升级
MySQL 8.0 不仅仅是一个性能优化版本,更是一次数据表达与智能优化能力的跃升。
其中两大特性尤其引人注目:
- JSON 功能增强(JSON Function Enhancements)
- 直方图(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 分布,选择最优索引路径。
发表回复