「超过三张表禁止 JOIN」,真正的原因
一些开发规范里有这条,但 JOIN 本身没有错。原因主要两个:
- 旧版本优化器弱:8.0.18 之前没有 hash join,连接列没索引时只能嵌套循环,行数一多就是 M × N 次比较。
- 分库分表:两张表不在同一个库里,数据库层面就 JOIN 不了。
所以在线接口常见的做法是单表查,再在应用层拼起来。
PostgreSQL 圈子里很少有这种规定:它很早就有 Nested Loop、Hash、Merge 三种连接,也很少拆分片。这条规范更像是「MySQL 5.x 加分库分表」那个时代的产物,不是 SQL 的真理。
不过有一点到今天也成立:点查和 WHERE 过滤仍然要靠索引,hash join 救不了全表扫描。