关于SQL JOIN和逻辑拼装的一些思考

29 阅读1分钟

先说结论: 大部分情况下逻辑拼装要优于直接联查

# 直接多表联查
select * from tag
join tag_post on tag_post.tag_id=tag.id
join post on tag_post.post_id=post.id
where tag.tag='mysql';

如果使用逻辑拼装,则会拆分成三条简单 sql

这里先总结优点

  1. 对于单表而言
    • 表结构简单更加利于后期维护
    • 子查询在代码中可以复用
    • 对于数据量大的表,查询的数据会指数级上升,非常考验数据库的索引维护
    • 缓存利用率的问题,单表查询可以通过维护索引来减少对数据库的 IO 次数
    • 在微服务的某些场景下,不得不使用逻辑拼装
  2. 对于多表而言
    • 多表查询可以将多个子查询嵌入到一次查询中,减少系统对数据库的 IO 次数
    • 逻辑简单:一次查询拿到所有数据,代码不需要再拼装。
    • 使用直接联查可以结合 mysql 优化器进行优化
    • 数据一致性问题

对比

在多数场景下,逻辑拼装的特性要优于直接联查,但是不能简单地认为逻辑拼装就是万能的.比如频繁修改的数据,如果使用逻辑拼装会显著增加对数据库的 IO 次数.对于一致性要求高的场景优先使用直接联查.

总结

建议从以下几点思考使用直接联查还是逻辑拼装:

  • 数据热点、可缓存 → 逻辑层拼装优先。
  • 一致性要求高、频繁修改 → SQL JOIN 优先。
  • 高并发、复杂关联 → 可以结合:缓存单表 + SQL 层 JOIN 关键表。