zoukankan      html  css  js  c++  java
  • 单表查询和多表连接查询哪个效率更快

    一.第一个解答来源于《高性能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);

    到底为什么要这样做?

    咋一看,这样做并没有什么好处,原本一条查询,这里却变成了多条查询,返回结果又是一模一样。

    事实上,用分解关联查询的方式重构查询具有如下优势:(高并发、高性能的应用中,一般建议使用单表查询)

    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! 对于自己的数据环境, 把两种方式都测试一下. 用数据说话.

    总结:建议还是用单表查询!

  • 相关阅读:
    利用 Python 写一个颜值测试小工具
    手敲代码太繁琐?“拖拉拽”式Python编程惊艳到我了
    一道 3 行代码的 Python面试题,我懵逼了一天
    这几个冷门却实用的 Python 库,我爱了!
    如何利用Python在网上接单,兼职也能月薪过万
    薪资高,福利好,会Python的人就是这么豪横!
    js_事件——鼠标滚轮事件
    CSS3_浮动造成的的li反向排列
    CSS3_-webkit-font-smoothing字体抗锯齿渲染
    解决a标签下的image元素下方的空白
  • 原文地址:https://www.cnblogs.com/fxl-njfu/p/11759973.html
Copyright © 2011-2022 走看看