IT技术博客大学习 共学习 共进步
全部 移动开发 后端 数据库 AI 算法 安全 DevOps 前端 设计 开发者

SQL里是否可以使用JOIN

火丁笔记 2016-12-22 23:30:22 累计浏览 6,813 次
本机暂存

   很多公司都禁止程序员在 SQL 中使用 JOIN,至于原因则出奇的一致:用 JOIN 慢。不过我从没见过谁来论证为什么用 JOIN 慢,结果这个人云亦云的结论越传越广,让我觉得是时候来讨论一下这个看似正确的结论了。

   

   举个例子:查询最新的十篇帖子和对应的用户信息,用 JOIN 是这样的:

SELECT posts.id, posts.content, users.name, ...
FROM posts
JOIN users on posts.user_id = users.id
ORDER BY posts.created_at DESC
LIMIT 10

   如果不使用 JOIN 的话,那么大概会改写成如下两条 SQL:

SELECT id, content, ...
FROM posts
ORDER BY created_at DESC
LIMIT 10

SELECT name, ...
FROM users
WHERE id in (...)

   第一次查询得到帖子数据,然后在程序代码里收集好想要的 user_id,第二次查询通过 user_id 得到用户数据,接着在程序代码里把两份数据组合起来。

   哪个快?我就不用跑个 bench 了吧,正常人都能看出来是用 JOIN 的快!

JOIN

JOIN

   在我看来,JOIN 的问题不是性能,而是当你执行 posts JOIN users 的时候,实际上相当于做出了一个假设:posts 和 users 两个结婚的表将永远住在同一个 DB 实例上,以后无论贫穷还是富有,疾病还是健康,永不分离。不过实际上,随着项目的发展,很可能会出现 posts 和 users 两个表不得不离婚的情况,结果它们会被划分到不同 DB 实例,一旦出现此类情况,那么当初使用 JOIN 的地方将不得不大量改写。

   至于 SQL 里是否可以使用 JOIN,如果相关的表以后有独立部署的可能性,那么就要考虑避免使用 JOIN,否则用 JOIN 也无妨。当然,有人会找出一些使用 JOIN 后效率奇差的例子,不过这样的问题一来可能是索引不佳,二来可能是特殊情况,用不用 JOIN 都会有类似的问题,只要使用的时候留意即可。下次如果大家再听到别人以性能为由反对 JOIN 的使用,那么不妨把本文的链接发给他,因为他多半没有搞清楚真正的原因是什么。

同分类推荐文章

  1. 使用deepseek进行Oracle恢复,引起重大故障 (2026-06-22 10:56:00)
  2. 接手一个只差临门一脚的数据库恢复 (2026-06-18 00:13:09)
  3. 我做了一个 AI 版的 StarRocks 升级风险扫描工具,直接帮我定位到一个风险 (2026-06-15 01:00:00)

查看更多 数据库 文章 →

建议继续学习

  1. MySQL数据库在实际应用一些方面的介绍 (累计阅读 36,397)
  2. 如何查找消耗资源较大的SQL (累计阅读 15,209)
  3. 其实,文件也可以truncate (累计阅读 8,571)
  4. MariaDB常见问题FAQ (累计阅读 8,341)
  5. 搜索引擎的特殊用法 (累计阅读 8,120)
  6. SQL vs NoSQL:数据库并发写入性能比拼 (累计阅读 7,999)
  7. Mysql的随机读取 (累计阅读 7,861)
  8. 索引与优化like查询 (累计阅读 7,336)
  9. 在百度的第一年 (累计阅读 6,919)
  10. SQL到NOSQL的思维转变 (累计阅读 6,844)