永远用小的结果集驱动大的结果集

转载自:公司内  数据工程师:

 永远用小的结果集驱动大的结果集
很多人喜欢在优化 SQL 的时候使用小表驱动大表,个人认为这不太严谨。为什么?因为大表经过 WHERE 条件过滤之后返回的结果集并不一定就比小表所返回的大,也许更小。在这种情况下如果仍然采用小表驱动大表,就会得到相反的性能效果。 
其实这也非常容易理解,在MySQL中,只有 Nested Loop 一种 Join 方式,也就是说MySQL的 Join 都是通过嵌套循环来实现的。驱动结果集越大,所需要循环就越多,那么被驱动表的访问次数自然也就越多,而每次访问被驱动表,即使需要的逻辑 IO 很少,循环次数多了,总量也不可能小,而且每次循环都不能避免消耗CPU,所以 CPU 运算量也会跟着增加。如果仅仅以表的大小来作为驱动表的判断依据,假若小表过滤后所剩下的结果集比大表多很多,结果就会在嵌套循环中带来更多的循环次数,反之,所需要的循环次数就会更少,总体 IO 量和 CPU 运算量也会更少。在非 Nested Loop  的 Join  算法中,如 Oracle  中的 Hash  Join,小结果集驱动大的结果集同样是最优的选择。 
所以,在优化 Join Query 的时候,最基本的原则就是“小结果集驱动大结果集”,通过这个原则来减少嵌套循环中的循环次数,以减少 IO总量及CPU运算的次数。 

SELECT
  pproductpr0_.p_product_prop_id AS col_0_0_,
  pproductpr0_.p_product_prop_code AS col_1_0_,
  pproductpr0_.p_product_prop_name AS col_2_0_,
  CASE WHEN pproductpr0_.p_product_prop_val IS NULL THEN '' ELSE pproductpr0_.p_product_prop_val END AS col_3_0_,
  pproductpr0_.p_product_prop_order AS col_4_0_,
  (SELECT
      bdic4_.b_dic_code
    FROM b_dic bdic4_
    WHERE bdic4_.b_dic_id = pproductpr0_.p_product_prop_must) AS col_5_0_,
  pproductpr0_.p_product_prop_status AS col_6_0_,
  (SELECT
      bdic5_.b_dic_code
    FROM b_dic bdic5_
    WHERE bdic5_.b_dic_id = pproductpr0_.p_product_prop_display) AS col_7_0_,
  pproductpr0_.p_product_prop_source AS col_8_0_,
  pproductpr0_.p_product_prop_int_code AS col_9_0_,
  pproduct3_.p_product_id AS col_10_0_,
  pproductpr0_.p_product_prop_default_value AS col_11_0_,
  (SELECT
      bdic6_.b_dic_code
    FROM b_dic bdic6_
    WHERE bdic6_.b_dic_id = pproductpr0_.p_product_prop_available) AS col_12_0_,
  (SELECT
      bdic7_.b_dic_code
    FROM b_dic bdic7_
    WHERE bdic7_.b_dic_id = pproductpr0_.p_product_prop_width) AS col_13_0_,
  (SELECT
      bdic8_.b_dic_code
    FROM b_dic bdic8_
    WHERE bdic8_.b_dic_id = pproductpr0_.p_product_prop_valid_type) AS col_14_0_,
  pproductty2_.p_ptp_classify_id AS col_15_0_,
  pproductty1_.p_ptype_prop_id AS col_16_0_,
  (SELECT
      bdic9_.b_dic_code
    FROM b_dic bdic9_
    WHERE bdic9_.b_dic_id = pproductpr0_.p_product_prop_source_type) AS col_17_0_,
  pproductpr0_.p_product_display_format AS col_18_0_,
  pproductpr0_.p_product_value_field AS col_19_0_,
  pproductpr0_.p_product_text_field AS col_20_0_,
  pproductpr0_.p_product_min_length AS col_21_0_,
  pproductpr0_.p_product_max_length AS col_22_0_,
  pproductpr0_.p_product_event_source AS col_23_0_,
  pproductpr0_.p_product_prop_prop_name AS col_24_0_,
  pproductpr0_.p_product_prop_create_on AS col_25_0_,
  pproductpr0_.p_product_prop_create_by AS col_26_0_,
  pproductpr0_.p_product_prop_update_on AS col_27_0_,
  pproductpr0_.p_product_prop_update_by AS col_28_0_
FROM p_product_prop pproductpr0_
  LEFT OUTER JOIN p_product_type_prop pproductty1_
    ON pproductpr0_.p_ptype_prop_id = pproductty1_.p_ptype_prop_id
  LEFT OUTER JOIN p_product_type_prop_classify pproductty2_
    ON pproductty1_.p_ptp_classify_id = pproductty2_.p_ptp_classify_id
  LEFT OUTER JOIN p_product pproduct3_
    ON pproductpr0_.p_product_id = pproduct3_.p_product_id
WHERE  pproductpr0_.p_product_id = 'C07C25F3621A4B509E9DCE111812B7BA'
AND EXISTS(
  SELECT pproductty2_.p_ptp_classify_id
  FROM  p_product_type_prop_classify pproductty2_
  WHERE  pproductty1_.p_ptp_classify_id = pproductty2_.p_ptp_classify_id
  AND pproductty2_.p_ptp_classify_id = '8a8a94e55162a9db015162b123470065')
ORDER BY pproductty1_.p_ptype_prop_order;

p_product_prop经过pproductpr0_.p_product_id = 'C07C25F3621A4B509E9DCE111812B7BA'
过滤之后就是个小的结果集

 再EXISTS的时候,效率也很高

 最终要的是能用上pproductpr0_.p_product_id的单键索引

时间: 2024-11-02 17:39:15

永远用小的结果集驱动大的结果集的相关文章

【干货合集】大流量与高并发:双11技术盘点(二)

峰会专题:https://yq.aliyun.com/activity/112 报名入口:http://yq.aliyun.com/webinar/join/49?spm=5176.8155509.437644.12.F2Xi5N 从2009年第一届双十一购物节到2015年双十一全天912.17亿元的交易额,"双十一"当天订单创建峰值增长了350倍(每秒14万笔),支付峰值 (每秒8.59万笔)增长了430倍.为了保证越来越多购物者的用户体验,在IT基础设施上,阿里一次又一次地遭遇并超

【干货合集】大流量与高并发:数据库、架构与实践技巧

峰会专题:https://yq.aliyun.com/activity/112 报名入口:http://yq.aliyun.com/webinar/join/49?spm=5176.8155509.437644.12.F2Xi5N 从2009年第一届双十一购物节到2015年双十一全天912.17亿元的交易额,"双十一"当天订单创建峰值增长了350倍(每秒14万笔),支付峰值 (每秒8.59万笔)增长了430倍.为了保证越来越多购物者的用户体验,在IT基础设施上,阿里一次又一次地遭遇并超

贵阳高新区大数据产业集群步入发展快车道

随着数据中心.呼叫中心.大数据广场等项目的建成,科技部批复我省依托贵阳高新区等开展贵阳大数据产业技术创新试验区建设试点,贵阳高新区大数据产业集群步入发展"快车道",截至去年底,高新区大数据产业营业收入达到300亿元,计划到2020年大数据营业收入突破1500亿元. 去年以来,通过与综保.白云两区深度融合,高新区加快培育大数据"1+N"产业体系(1是数据中心,N是云计算.电子商务.呼叫中心.软件设计及服务外包.大数据金融.大数据加工和安全.端产品制造),建成投用一批数

轻公司时代:把公司做小,把客户做大

传统的商业法则正在受到挑战,销售额高于一切的时代已经过去,利润才是王道. 那些规模小,但利润高的互联网新贵,正在挑战传统行业里那些"身材"臃肿,人员众多,成本高昂的企业.近一段炒得火热的YESPPG就是一个典型,这家在互联网上销售男装衬衫的公司虽然只有500号人,却能日处理1万件服装的发货,国内服装业老大之一的雅戈尔现在也不过是1.3万件.而且,YSEPPG公司成立至今,不过短短两年时间. 一些传统行业的公司也正展开变革.海尔集团总裁杨绵绵声称,海尔的目标是"把公司做小,把客

从单机到集群会话的管理之集群模式二(更大的集群)

<从单机到集群会话的管理之集群模式一>中讲到的全节点复制的网络流量随节点数量增加呈平方趋势增长,也正是因为这个因素导致无法构建较大规模的集群,为了使集群节点能更加大,首要解决的就是数据复制时流量增长的问题,下面将介绍另外一种会话管理方式,每个会话只会有一个备份,它使会话备份的网络流量随节点数量的增加呈线性趋势增长,大大减少了网络流量和逻辑操作,可构建较大的集群. 下面看看这种方式具体的工作机制,集群一般是通过负载均衡对外提供整体服务,所有节点被隐藏在后端组成一个整体.前面各种模式的实现都无需负

CAAI演讲实录|微软邓力:驱动大数据人工智能多种应用的三类深度学习模式

8月26日至27日,在中国科学技术协会.中国科学院的指导下,由中国人工智能学会发起主办.中科院自动化研究所与CSDN共同承办的2016中国人工智能大会(CCAI 2016)在北京辽宁大厦盛大召开,这也是本年度国内人工智能领域规模最大.规格最高的学术和技术盛会,对于我国人工智能领域的研究及应用发展有着极大的推进作用.大会由CSDN网站进行专题直播,并由百度开放云提供独家视频直播技术支持. 在26日的主题报告环节,微软人工智能首席科学家.IEEE Fellow邓力博士做了<驱动大数据人工智能多种应用

代码-自学PHP mysql web开发小次鸟,寻求大神帮助 第23章会话控制

问题描述 自学PHP mysql web开发小次鸟,寻求大神帮助 第23章会话控制 代码运行一直提示我第23行有错误<?phpsession_start();//开始会话 if (isset($_POST['userid'])&&isset($_POST['password'])) {//使用者尝试登录$userid=$_POST['userid'];$password=$_POST['password']; $db_conn=new mysqli('localhost''root'

小品牌手机消亡?大品牌厂商意淫!

摘要: 中小品牌 手机 企业又一次被加速消亡 近日,百立丰(LePhone)手机董事长黄明权对媒体表示,3G市场如甩货不及时将会死掉很多中小品牌企业.高端市场需要巨大投入支撑难以为继,低 中小品牌 手机 企业又一次"被加速消亡" 近日,百立丰(LePhone)手机董事长黄明权对媒体表示,3G市场如甩货不及时将会死掉很多中小品牌企业.高端市场需要巨大投入支撑难以为继,低端现在又被酷派.小米等企业打成了红海市场,因此对于中小品牌而言,需要与互联网企业.运营商共同合作细分市场才有机会.黄明权

平滑-VC 中关于控件美观的小问题,求救各路大神的帮助啦!!

问题描述 VC 中关于控件美观的小问题,求救各路大神的帮助啦!! VC++ 6.0 怎么使对话框上控件(如static.Edit等)的四个角变得平滑?? 解决方案 直接自绘就可以实现,但是自己实现的缺点是,工作量大,要考虑和不同的操作系统以及不同的主题适配,你自己机器看上去不错,换了计算机别的主题设置,别人用了不同的字体大小,未必就适合了. 最好是使用现成的第三方控件.比如devexpress或者bcgcontrolbar,还有一些皮肤控件.比如金山UI等等. VS2012开始,MFC集成了一个