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

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

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

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

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

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

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

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

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

更多文章
  • Go设计模式:composite模式
  • 拯救删除ZFS之后的分区表
  • Linux使用redshift自动调整屏幕色温
  • Go设计模式:桥接模式和策略模式
  • Go设计模式:单例模式、原型模式和Builder模式
  • 操作系统也是CRUD
  • Go设计模式:简单工厂模式
  • 把USB设备穿透给虚拟机里的系统
  • debug故事之:事务让生活更美好
  • Go设计模式:模板模式
  • Go设计模式:适配器模式
  • Go设计模式:Iterator
  • glusterfs 笔记
  • 用peewee代替SQLAlchemy
  • Go的slice工作机制