单表查询和多表连接查询哪个效率更快
⼀.第⼀个解答来源于《⾼性能Mysql》中的回答
很多⾼性能的应⽤都会对关联查询进⾏分解。简单地,可以对每个表进⾏⼀次单表查询,然后将结果在应⽤程序中进⾏关联。例如,下⾯这个查询:
select * from tag
join tag_post on tag_post.tag_id=tag.id
join post on tag_post.post_id=post.id
where tag.tag=’mysql’;
可以分解成下⾯这些查询来代替:
Select * from tag where tag=’mysql’;
Select * from tag_post where tag_id=1234;
Select * from post where id in(123,456,567,9989,8909);
到底为什么要这样做?join on是什么连接
咋⼀看,这样做并没有什么好处,原本⼀条查询,这⾥却变成了多条查询,返回结果⼜是⼀模⼀样。
事实上,⽤分解关联查询的⽅式重构查询具有如下优势:(⾼并发、⾼性能的应⽤中,⼀般建议使⽤单表查询)
1. 让缓存的效率更⾼。
许多应⽤程序可以⽅便地缓存单表查询对应的结果对象。另外对于MySQL的查询缓存来说,如果关联中的某个表发⽣了变化,那么就⽆法使⽤查询缓存了,⽽拆分后,如果某个表很少改变,那么基于该表的查询就可以重复利⽤查询缓存结果了。
2. 将查询分解后,执⾏单个查询可以减少锁的竞争。
3. 在应⽤层做关联,可以更容易对数据库进⾏拆分,更容易做到⾼性能和可扩展。
4. 查询本⾝效率也可能会有所提升。
5. 可以减少冗余记录的查询。
6. 更进⼀步,这样做相当于在应⽤中实现了哈希关联,⽽不是使⽤MySQL的嵌套环关联,某些场景哈希关联的效率更⾼很多。
7. 单表查询有利于后期数据量⼤了分库分表,如果联合查询的话,⼀旦分库,原来的sql都需要改动。
8. 上次看到某个CTO技术分享,公司规定底层禁⽌⽤join联合查询。数据⼤的时候确实慢。
9. 联合查询或许确实快,但是mysql的资源通常⽐程序代码的资源紧张的多。
⼆.其他回答
情景假设:假设⽹站有⼀个公司库版块,我想搜索某城市的所有公司。
数据表:tbl_company  (t1)、  tbl_city  (t2)。
例1: t1表中存cityid  根据id做表连接查询  select * from t1 inner join t2 on t1.cityid=t2.cityid;
例2: t1表中存cityName ⽤户前台点击上海市,则把上海市的id传到后台(不考虑传cityName),根据id查出cityName          select cityName from t2 where cityid= #{cityid};,然后 select * from t1 where cityName = #{cityName};
两者区别:例1中只做了⼀次表关联查询,例2中分别做了两次单表查询。
考虑到数据量⼤,多表连接查询会影响查询效率所以都优化为单表查询。 TP:以上是在不使⽤索引的情况下
请问哪种效率会更⾼些?
答:sql优化与业务也有关系,这条语句的查询会不会频繁,要不要考虑2次连接带来的开销,如果这些都不⽤考虑的话,都没有索引的情况下,感觉相差不⼤,2应该略优于1。
数据没有特别⼤的情况还是级联查询快。
对于传统的数据库涉及来说, 尽可能减少数据库查询次数.
BUT, 1. mysql都对处理连接/断开连接, 回复⼩⽽简单的查询是⾮常快的; 2.现在的⽹络已经⾮常快了. 所以多个⼩的查询对mysql来说可能更
快⼀些.
最后, ⼤神也没有结论哪个更好. 呵呵, 其实整本书都明确表达⼀个意思, 测试测试! 做benchmark! 对于⾃⼰的数据环境, 把两种⽅式都测试⼀下. ⽤数据说话.
总结:建议还是⽤单表查询!