情景
- 实现一个查询功能可以使用一条联表查询sql语句来查出所有的结果
- 也可以对 n 条sql语句的查询结果拼凑实现
多sql语句会有网络通讯时间损耗,联表查询会有查询时间过长的损耗
问题
- 联表查询与多sql查询的性能差距,以及导致差距的原因
- 怎么权衡这两者的损耗?即何时会使用联表查询,何时会使用多sql查询?
- 实际开发中推荐哪种方式?
多sql语句会有网络通讯时间损耗,联表查询会有查询时间过长的损耗
8 回答6.6k 阅读
4 回答717 阅读✓ 已解决
2 回答3.4k 阅读
5 回答1.5k 阅读
3 回答1.9k 阅读✓ 已解决
1 回答2.2k 阅读✓ 已解决
2 回答2.2k 阅读
这个问题其实问得很大,所以答起来也很困难,而且各家情况不同,数据库的数据量,是否使用缓存等也影响着这个问题的答案。
所以以下回答,都基于我现在的使用场景,实际情况可能互有不同。
联表查询在数据量较为庞大的情况下,受限于数据库的性能,其效率一定程度上是不如单表查询的。
首先,因为对数据库进行读写时,数据库本身是有锁机制的,联表查询会增加锁竞争消耗的时间。其次,查询缓存,如果你将一定的数据放入了缓存,联表查询会放弃这部分缓存的使用,效率肯定是不如单表查询的。而且,随着业务数据的增长,过多的联表查询会增加业务拓展的难度,例如后期的分表分库。此外,联表查询产生的数据可能并非是你精确想要的,极大可能是会查询到部分冗余数据。最后,如果考虑到可能会产生的需求变更,联表查询可能不满足需新的需求,其改动难度是大于单表查询后在业务层处理这部分数据的。
《阿里巴巴JAVA开发手册》中超过三张表禁止join操作也是考虑到这些问题。
至于实际开发中使用哪种,考虑到可能的用户及数据的增长,个人建议单表查询,然后在业务层处理,便于拓展,灵活性也较高。