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}
次数 | 联表查询 | 单表多次查询 |
---|---|---|
第一次 | 783ms | 799ms |
第二次 | 754ms | 766ms |
第三次 | 829ms | 773ms |
在数据量不多的情况下,多表连接查询和多次单表查询的效率是差不多的。如果数据量足够大,多次单表查询的效率更高。
此时查询的是一条记录,两者相差甚小。所以对于联表查询,建议将其分解为多个单表查询,而且单表查询还有不少优点。👇
2.单表的优点
- 多次单表查询,让缓存的效率更高。许多应用程序可以方便地缓存单表查询对应的结果对象。另外对于MySQL的查询缓存来说,如果关联中的某个表发生了变化,那么就无法使用查询缓存了,而拆分后,如果某个表很少改变,那么基于该表的查询就可以重复利用查询缓存结果了。
- 将查询分解后,执行单个查询可以减少锁的竞争。
- 在应用层做关联,更容易对数据库进行拆分,更容易做到高性能和可扩展。
- 查询本身效率也可能会有所提升。
- 可以减少冗余记录的查询。
- 在应用中实现了哈希关联,而不是使用MySQL的嵌套环关联,某些场景哈希关联的效率更高很多。
- 单表查询有利于后期数据量大了分库分表,如果联合查询的话,一旦分库,原来的sql都需要改动。
- 很多大公司明确规定禁用join,因为数据量大的时候查询确实很慢所以在数据量不大的情况下,两种方式的查询都没什么明显的差别,使用多表连接查询更方便。但是在数据量足够大几十万、几百万甚至上亿的数据,或者在一些高并发、高性能的应用中,一般建议使用单表查询。