上一篇
📢 最新动态(2025年8月)
MySQL 8.3最新版本优化了递归查询性能,针对百万级树形数据查询速度提升40%!现在连电商平台的“类目层级展开”都能毫秒级响应啦~
想象你在处理这些场景:
这些树形结构数据如果用传统多次查询,代码会写成“俄罗斯套娃”😵💫,而递归查询只需1条SQL就能搞定整棵树!
WITH RECURSIVE 递归名 AS ( -- 初始查询(根节点) SELECT 基础字段 FROM 表 WHERE 起始条件 UNION ALL -- 递归部分 SELECT t.字段 FROM 表 t JOIN 递归名 r ON t.parent_id = r.id ) SELECT * FROM 递归名;
WITH RECURSIVE org_tree AS ( -- 先找到CEO SELECT id, name, title FROM employee WHERE id = 1 UNION ALL -- 递归找下属 SELECT e.id, e.name, e.title FROM employee e JOIN org_tree ot ON e.manager_id = ot.id ) SELECT * FROM org_tree;
👉 输出结果:
id | name | title
----|--------|-----------
1 | 张三 | CEO
2 | 李四 | CTO ← 张三下属
3 | 王五 | 研发主管 ← 李四下属
深度控制:防止无限循环
WITH RECURSIVE ... ( SELECT ..., 0 AS level UNION ALL SELECT ..., level+1 WHERE level < 10 -- 限制递归10层 )
路径记录:追踪完整链路
SELECT CONCAT(r.path, '→', t.name) AS full_path
循环引用:A→B→C→A 会导致无限递归
解决方案:添加 WHERE NOT FIND_IN_SET(id, 已访问路径)
大数据量卡死:
建议:对parent_id
字段加索引,并用LIMIT
分批次查询
-- 查询“手机”类目下所有子类目 WITH RECURSIVE category_tree AS ( SELECT id, name FROM category WHERE name = '手机' UNION ALL SELECT c.id, c.name FROM category c JOIN category_tree ct ON c.parent_id = ct.id ) SELECT * FROM category_tree;
-- 查找某条评论的所有回复(按层级缩进) WITH RECURSIVE comment_tree AS ( SELECT id, content, 0 AS depth FROM comments WHERE parent_id IS NULL UNION ALL SELECT c.id, CONCAT(REPEAT(' ', ct.depth+1), c.content), ct.depth+1 FROM comments c JOIN comment_tree ct ON c.parent_id = ct.id ) SELECT content FROM comment_tree ORDER BY depth;
方案 | 优点 | 缺点 |
---|---|---|
递归CTE | 单次查询完成 | MySQL 8.0+才支持 |
存储过程 | 兼容老版本 | 代码复杂度高 |
应用层递归 | 灵活可控 | 网络开销大 |
💡 专家建议:MySQL 8.0+项目无脑选递归CTE,旧系统可用存储过程+临时表组合方案
掌握MySQL递归查询,你就能:
✅ 用1条SQL替代N次循环查询
✅ 轻松处理组织架构/评论树/权限继承等场景
✅ 减少应用层代码复杂度
下次遇到“查祖宗十八代”的需求时,试试WITH RECURSIVE
吧!✨
(注:本文测试环境为MySQL 8.3,语法兼容8.0+版本)
本文由 包坚成 于2025-08-02发表在【云服务器提供商】,文中图片由(包坚成)上传,本平台仅提供信息存储服务;作者观点、意见不代表本站立场,如有侵权,请联系我们删除;若有图片侵权,请您准备原始证明材料和公证书后联系我方删除!
本文链接:https://vps.7tqx.com/wenda/511034.html
发表评论