640 字
2 分钟
第 8 章 MySQL 高级应用技术
阅读提示本文配图包含高亮/纯白底色内容,暗光环境下阅读请注意调整屏幕亮度,避免刺眼。
本章介绍数据处理的高级应用,包括原生的 JSON 支持,树状结构表示,以及深度分页查询优化。
8.1 MySQL 与 JSON 数据处理
MySQL 8.0 提供了原生的 JSON 数据类型和丰富的处理函数,将非结构化文档与关系型表格融合。
- JSON 常用函数:
JSON_OBJECT(key, val, ...):将键值对转化为 JSON 对象。JSON_ARRAY(val, ...):创建 JSON 数组。JSON_EXTRACT(json_doc, path):提取指定 JSON 路径的值。可以使用缩写操作符->。JSON_UNQUOTE(json_val):去掉提取出的 JSON 字符串的引号。缩写操作符为->>。
-- 查询 myJsonOrders 表中 items 数组内第一个商品的商品名称SELECT OrderID, items->'$.items[0].ProductName' AS FirstProductFROM myJsonOrders;
-- 提取并去除双引号SELECT OrderID, items->>'$[0].ProductName' AS FirstProductCleanFROM myJsonOrders;
8.2 关系数据库中的层次树状模型存储与处理
处理树状结构(如组织架构、商品多级分类)在关系数据库中有几种典型设计:
8.2.1 邻接表模型(Adjacency List)每个结点增加一个 ParentNodeID 字段指向其父结点。这是最常用也是最符合直觉的存储方式。
- 优点:新增、修改节点极为简单,只需修改
ParentNodeID。 - 缺点:若不借助递归 CTE,很难直接查询某节点的所有祖先或所有子孙(需要多层自连接)。
CREATE TABLE CategoryTree ( CategoryID CHAR(14) PRIMARY KEY, CategoryName VARCHAR(100) NOT NULL, ParentNodeID CHAR(14), IsParentFlag TINYINT, -- 1 表示父节点,0 表示叶子节点 Level TINYINT, -- 树的层级 Ancestor VARCHAR(150) -- 所有祖先节点路径,如 A#A1#);8.2.2 路径枚举模型(Path Enumeration)在表中维护一个 Ancestor(或 Path)字段,存储该节点到根节点的完整路径(如 A#A1#)。
- 查询所有祖先:直接读取当前行的
Ancestor字段并使用路径分隔符解析。 - 查询所有子孙:使用
LIKE匹配前缀:SELECT * FROM CategoryTree WHERE Ancestor LIKE 'A#A1#%';
8.3 数据库查询性能优化
- 深度分页优化(LIMIT OFFSET):
- 问题:
LIMIT 1000000, 10会导致 MySQL 扫描 行并抛弃前面的 行,IO 开销巨大。 - 优化方案:延迟关联(子查询优化)。先利用覆盖索引(仅检索主键)快速找出分页的主键 ID,然后再与原表关联获取整行数据:
limit_optimization.sql -- 优化前SELECT * FROM Orders ORDER BY OrderDate DESC LIMIT 100000, 10;-- 优化后SELECT a.* FROM Orders aJOIN (SELECT OrderID FROM Orders ORDER BY OrderDate DESC LIMIT 100000, 10) bUSING(OrderID);
- 问题:
- 索引优化建议:
- 对
WHERE子句和ORDER BY子句中频繁出现的列创建索引。 - 创建联合索引时,必须遵循 最左匹配原则(如建立
(A, B, C)索引,只有查询条件包含A时索引才生效)。 - 避免在索引列上使用函数或进行表达式计算(如
WHERE YEAR(OrderDate) = 2018会使索引失效,应改为WHERE OrderDate BETWEEN '2018-01-01' AND '2018-12-31')。
- 对
分享
如果这篇文章对你有帮助,欢迎分享给更多人!
第 8 章 MySQL 高级应用技术
https://blog.sopak.space/posts/study/economics-management/dp-a/8/ 部分信息可能已经过时
相关文章 猜你想看

