You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

多次从相同两表取单条字符串时应使用子查询还是join?

子查询与多JOIN写法的逻辑与性能差异解答

你此前对两种写法的运行逻辑理解存在偏差,现代关系型数据库的优化器不会按照你预想的低效率方式执行,两者的实际运行差异如下:

1. 你对JOIN运行逻辑的误解

你认为JOIN会拉取两张全表合并再取数,这个情况只会出现在无索引、关联条件无过滤的极端场景下:

  • 你的场景中empcod是emptable的主键,自带唯一B+树索引,每次JOIN匹配时只会走主键索引定位到对应行,不会扫描整张emptable
  • 优化器会自动做投影裁剪,只会取你SELECT语句中需要的name字段,不会拉取emptable的全部字段
  • 多JOIN的过程是批量匹配,不是逐行全表合并,最终生成的临时数据只有你需要的字段,不存在冗余数据占用大量资源的问题

2. 你对子查询运行逻辑的认知盲区

你写的是相关子查询,执行逻辑实际上比你预想的开销更高:

  • 每返回一行codetable的结果,就要执行6-7次独立的子查询。如果codetable有1000行数据,就要执行6000-7000次对emptable的索引查询,开销是逐次累加的
  • 子查询每次都是独立执行,优化器很难做批量复用,部分数据库甚至不会缓存相同编码的查询结果,相同的编码重复出现时会重复查询

3. 两种写法的实际对比

对比维度相关子查询写法多JOIN写法
性能(codetable数据量大时)差,执行次数随行数线性增长好,优化器可做批量匹配优化
可维护性差,新增字段需要修改每个子查询好,新增字段只需在对应JOIN别名后加字段
结果灵活性缺省返回NULL,对应LEFT JOIN效果可自由选择INNER JOIN(过滤无匹配行)/LEFT JOIN(保留无匹配行)
可读性子查询重复堆砌,难以快速对应编码和姓名的关系关联条件一目了然,对应关系清晰

额外注意事项

你上司写的是INNER JOIN,如果业务中存在codetable的code值没有对应员工记录的情况,INNER JOIN会直接过滤掉整行数据,如果需要保留这些行、返回NULL姓名,把INNER JOIN改成LEFT JOIN即可。
你可以直接用数据库的执行计划工具(如MySQL的EXPLAIN、PostgreSQL的EXPLAIN ANALYZE)跑两个语句看实际开销,绝大多数场景下JOIN写法的执行效率会更高。

内容的提问来源于stack exchange,提问作者Trisha

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 15:42:04