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

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

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

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

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

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

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

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

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

更多文章
  • HTTP/2 简介
  • 独立运营博客一年的一些数据分享
  • To B(usiness) 和 To C(ustomer)
  • Cookie 中的secure和httponly属性
  • 常见的软件架构套路
  • Google Ads使用体验
  • Go的custom import path
  • 如何挖掘二级子域名?
  • Go Module 简明教程
  • 写了一个Telegram Bot:自动化分享高质量内容
  • 为什么我选择放弃运营微信公众号?
  • ArchLinux 怎么降级 package ?
  • Vim打开很慢,怎么找出最慢的插件?怎么解决?
  • Web后端工程师进阶指南(2018)
  • How to implement fork syscall in Golang?