为什么要把复杂的联表操作拆成多个单表查询?

我们在系统优化的时候,常见的一个操作,就是把复杂的联表操作,拆解成多个单表操作,然后在应用程序中进行联接。为什么要 这样做呢?相信大家都可以列出几点。不过《高性能MySQL 第四版》对此有很好的总结,值得细品。摘录如下:

  • 让缓存的效率更高。应用程序中,简单查询对应的代码也会更简单,也就更好设计缓存,应用程序可以拆开来,缓存其中的结果,以便 下次使用复用

  • 将查询分解后,执行单个查询可以减少锁的竞争

  • 在应用层做联接,可以更容易对数据库进行拆分,更容易做到高性能和可扩展

  • 查询本身的效率可能也会有所提升

  • 可以减少对冗余记录的访问,MySQL联表操作可能会访问很多数据,并且可能是重复的访问

除此之外,我个人的补充:

  • 将联表操作放到应用层,很大的一个好处是可扩展性。扩展应用层,比扩展数据库要容易的多,通常应用层都是stateless的,可以直接scale
  • simple is better,无论对于什么来说都是
  • 把操作拆成多个小任务,可以在多个事务中执行,如果一个大事务中,有加锁或者等待,就会阻塞其他事务,拆开以后概率会降低
  • 对于整体操作的控制粒度变得更加精细,很多操作都变得更加可控

更多文章
  • OAuth 2 详解(一):简介及 Authorization Code 模式
  • ElasticSearch 学习笔记
  • 三种git流程以及发版模型
  • 错误处理实践
  • 权限模型(RBAC/ABAC)
  • OIDC(OpenID Connect) 简介
  • 任务队列简介
  • 使用Drone CI构建CI/CD系统
  • PostgreSQL 操作笔记
  • Golang migrate 做数据库变更管理
  • 使用PostgreSQL做搜索引擎
  • Nginx 源码阅读(三): 连接池、内存池
  • Nginx 源码阅读(二): 请求处理
  • Nginx 源码阅读(一): 启动流程
  • Go 泛型简明教程