单表多次查询和联表查询的选择

在数据量不大时,联表查询与单表多次查询效率相近,但随着数据增长,单表查询更具优势,减少锁竞争,利于缓存及数据库拆分。单表查询能提高缓存利用率,减少冗余查询,便于数据库扩展,并在某些场景下效率更高。因此,对于高并发、大数据量场景,推荐使用单表查询。
摘要由CSDN通过智能技术生成

1.单表和联表查询的效率比较

比如:有两张表,用户表和部门表,查询用户名称和部门名称

//联表查询:
select user.username,dept.name from sys_user user,sys_dept dept where user.id=#{userId} and user.dept_id=dept.id
//分解后的单表查询,先查用户表,在查部门表
select username,dept_id from sys_user where id=#{userId}
select name from sys_dept where id=#{deptId}
次数联表查询单表多次查询
第一次783ms799ms
第二次754ms766ms
第三次829ms773ms

在数据量不多的情况下,多表连接查询和多次单表查询的效率是差不多的。如果数据量足够大,多次单表查询的效率更高。

此时查询的是一条记录,两者相差甚小。所以对于联表查询,建议将其分解为多个单表查询,而且单表查询还有不少优点。👇

2.单表的优点

  • 多次单表查询,让缓存的效率更高。许多应用程序可以方便地缓存单表查询对应的结果对象。另外对于MySQL的查询缓存来说,如果关联中的某个表发生了变化,那么就无法使用查询缓存了,而拆分后,如果某个表很少改变,那么基于该表的查询就可以重复利用查询缓存结果了。
  • 将查询分解后,执行单个查询可以减少锁的竞争。
  • 在应用层做关联,更容易对数据库进行拆分,更容易做到高性能和可扩展。
  • 查询本身效率也可能会有所提升。
  • 可以减少冗余记录的查询。
  • 在应用中实现了哈希关联,而不是使用MySQL的嵌套环关联,某些场景哈希关联的效率更高很多。
  • 单表查询有利于后期数据量大了分库分表,如果联合查询的话,一旦分库,原来的sql都需要改动。
  • 很多大公司明确规定禁用join,因为数据量大的时候查询确实很慢所以在数据量不大的情况下,两种方式的查询都没什么明显的差别,使用多表连接查询更方便。但是在数据量足够大几十万、几百万甚至上亿的数据,或者在一些高并发、高性能的应用中,一般建议使用单表查询。
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在某些情况下,可以使用两次查询来替代联表查询。假设有两个表A和B,需要根据它们之间的关联进行查询。 一种替代方案是使用第一次查询获取表A中的相关数据,然后使用这些数据作为条件进行第二次查询。以下是一个示例: ```java // 第一次查询获取表A中的相关数据 String query1 = "SELECT column1, column2 FROM tableA WHERE condition"; ResultSet result1 = statement.executeQuery(query1); List<String> conditions = new ArrayList<>(); while (result1.next()) { // 获取表A中的相关数据,并将其作为条件存储起来 String condition = result1.getString("column1"); conditions.add(condition); } // 使用第一次查询获取的数据作为条件进行第二次查询 String query2 = "SELECT column3, column4 FROM tableB WHERE column3 IN (?)"; String conditionString = String.join(",", conditions); query2 = query2.replace("?", conditionString); ResultSet result2 = statement.executeQuery(query2); // 处理第二次查询结果 while (result2.next()) { // 处理表B中的数据 String column3Value = result2.getString("column3"); String column4Value = result2.getString("column4"); // ... } ``` 这种方法的优点是可以避免复杂的联表查询,而是使用两个简单的查询来完成任务。然而,它也存在一些缺点,例如需要进行多次查询和额外的数据传输。因此,在实际应用中,需要根据具体情况权衡利弊来选择合适的查询方式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值