在线精品99_中国九九盗摄偷拍偷看_91免费版在线观看_91.app_91高清视频在线_99热最新网站

join 优化的基本原则有哪些

92次阅读
没有评论

共计 4413 个字符,预计需要花费 12 分钟才能阅读完成。

这篇文章给大家分享的是有关 join 优化的基本原则有哪些的内容。丸趣 TV 小编觉得挺实用的,因此分享给大家做个参考,一起跟随丸趣 TV 小编过来看看吧。

1、join 优化的基本原则:
   a:小结果集驱动大结果集
   b:   确保被驱动的表被索引
   c:   不能确保驱动表被索引加大 join_buffer_size 的大小。

  原理:mysql 的 join 算法只有一种  Nested Loop Join  算法。其最基本原理是 循环取驱动表中的每一条记录,
      到匹配表中过滤,得到结果集 list,再次循环 list 每条记录到下个匹配表中过滤,以此类推。

  伪代码【2 表关联】:
         for each recode in table_a {
              for each recode in table_b that table_a.column=table_b.column {
                     combination to output;
              }
         }

解析:Nested Loop Join 嵌套循环的代价取决于,内外循环代价的乘积。即【驱动表行数】N*M【到匹配表中查找一次代价】
     innodb B+ 树索引的高度一般是 3 至  4,也就是说一般情况下不管是哪个表作为匹配表,其一次查询代价是常量 T
      即 Join 代价: N【表行数】*T【常量】所以 要用小结果集作为驱动表,另外强调一点是小结果集而不是小表,因为小、大 是相对的,完全有可能大表通过过滤的结果
      集比小表还要小的   多。所以强调小结果集。

案例:1.2 亿大表关联,优化前执行 3 个小时没有结果。。。。。。阿拉好想唱  “等你 爱我 爱我哪怕只有一次也就足够 ……..”
select c.current_name,count(*) 
from  ( select distinct PHONE from cis_data_qixin_score        )a 
join TMP_A1_INFO_MOBILE_H_20151201 b on  substr(a.PHONE,1,7)=b.mobile_h_code    
join TMP_A1_DICT_AREA_20151201 c on c.tele_code=b.prov_telecode 
group by c.current_name  ; 

说明:sql 功能是获取 每个省的 电话号码数量。cis_data_qixin_score:号码表,TMP_A1_INFO_MOBILE_H_20151201  号码 H 码表,TMP_A1_DICT_AREA_20151201
        号码 H 码对应省份表
执行计划:
+—-+————-+———————-+——-+——————-+——————-+———+——+———–+—————————————+
| id | select_type | table                | type  | possible_keys     | key               | key_len | ref  | rows      | Extra                                 |
+—-+————-+———————-+——-+——————-+——————-+———+——+———–+—————————————+
|  1 | PRIMARY     | c                    | ALL   | NULL              | NULL              | NULL    | NULL |        41 | Using temporary; Using filesort       |
|  1 | PRIMARY     |           | ALL   | NULL              | NULL              | NULL    | NULL | 124364159 | Using join buffer (Block Nested Loop) |
|  1 | PRIMARY     | b                    | ref   | idx_mobile_h_code | idx_mobile_h_code | 33      | func |         1 | Using index condition; Using where    |
|  2 | DERIVED     | cis_data_qixin_score | index | PRIMARY,idx_phone | idx_phone         | 62      | NULL | 124364159 | Using index                           |
+—-+————-+———————-+——-+——————-+——————-+———+——+———–+—————————————+

分析:由执行计划可知  cis_data_qixin_score 通过号码去重后的衍生表 DERIVED2   的 124364159   条记录【实际大概 8 千万,执行计划统计的不太精确】  作为驱动表和匹
    配表 idx_mobile_h_code 35W 条记录 进行 Jion。这个正犯了“兵家之大忌”,大的结果集作为驱动表 其代价为  124364159T  。又不能选择小表作为驱动表,
    怎么办?现在的妹子不都是天天企盼着要减肥嘛,那我们也对“驱动表”这个妹子瘦瘦身吧。

sql 功能分析:通过号码表和号码码表  substr(a.PHONE,1,7)=b.mobile_h_code 关联 得到 号码的省份的 code, 在和 省份表关联 得到省份名称,最后通过省份名称分组得
              出所有省份的号码数量。  也就是说 PHONE 的前七位的的数字对应相同的 省份 code。一言以蔽之。直接对 phone 的前七位分组,再 join。
                 

改写后 sql:
 select c.current_name,sum(a.cou) 
 from  ( 
       select substr(a.PHONE,1,7) PHONE_h_code ,count(*) cou  
       from (select distinct PHONE from cis_data_qixin_score  ) a 
       group by  substr(a.PHONE,1,7)  order by null 
      )a 
       join TMP_A1_INFO_MOBILE_H_20151201 b on a.PHONE_h_code=b.mobile_h_code    
       join TMP_A1_DICT_AREA_20151201 c on c.tele_code=b.prov_telecode 
 group by c.current_name  ;    

执行计划:
+—-+————-+———————-+——-+——————-+————-+———+—————————-+———–+—————————————————-+
| id | select_type | table                | type  | possible_keys     | key         | key_len | ref                        | rows      | Extra                                              |
+—-+————-+———————-+——-+——————-+————-+———+—————————-+———–+—————————————————-+
|  1 | PRIMARY     | c                    | ALL   | NULL              | NULL        | NULL    | NULL                       |        41 | Using temporary; Using filesort                    |
|  1 | PRIMARY     | b                    | ALL   | idx_mobile_h_code | NULL        | NULL    | NULL                       |    318794 | Using where; Using join buffer (Block Nested Loop) |
|  1 | PRIMARY     |           | ref   |       |  | 23      | cis_gather.b.mobile_h_code |       390 | Using where                                        |
|  2 | DERIVED     |           | ALL   | NULL              | NULL        | NULL    | NULL                       | 124364170 | Using temporary                                    |
|  3 | DERIVED     | cis_data_qixin_score | index | PRIMARY,idx_phone | idx_phone   | 62      | NULL                       | 124364170 | Using index                                        |
+—-+————-+———————-+——-+——————-+————-+———+—————————-+———–+—————————————————-+
5 rows in set (0.00 sec)

解析:通过 对号码前 7 位分组得到物化表【大概 35w】自动创建索引  PHONE_h_code 作为匹配表  。join 代价为 350000T
      改写前后 join 代价之比为: 124364159T /350000T = 355  哈哈 是不是有种飞起来的赶脚。

结果:优化后的 sql  4   分钟 搞定。

感谢各位的阅读!关于“join 优化的基本原则有哪些”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-07-26发表,共计4413字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)
主站蜘蛛池模板: 99热久久这里只有精品23 | 日韩精品在线播放 | 婷婷色婷婷 | 91sao在线看片水片 | 九九精品国产亚洲av日韩 | 国产偷自一区二区三区 | 网禁呦萝资源网站在线观看 | 看免费黄色录像 | 白浆一区 | 国产男女猛视频在线观看网站 | 久草精品视频在线观看 | 亚洲综合第一区 | 国产成人免费永久播放视频平台 | 亚洲欧美日韩中文综合v日本 | 国产丝袜一区视频在线观看 | 看全大色黄大色黄大片一级爽 | 国产伦精品免编号公布 | 天天摸天天操天天爽 | 美女内部福利视频在线观看 | 免费看欧美一级a毛片 | 久久se精品一区二区影院 | 亚洲av综合色区无码另类小说 | 国产99精品 | 精品国产av一区二区三区 | 国语对白xxxx中国妞xxxx | 成人激情视频在线观看 | 亚洲熟妇av日韩熟妇在线 | 99国产精品免费观看视频 | 久久久久久久一精品 | 亚洲精品成人网 | 免费视频一区二区三区四区 | 亚洲欧美日韩在线一区二区三区 | 欧美日韩日本国产 | 久久久亚洲精品国产 | 亚洲自偷自偷图片在线高清 | 亚洲熟妇无码久久精品 | 人禽无码视频在线观看 | 91短视频社区在线观看 | 亚洲人成网站在线观看90影院 | 国产成年女人毛片80s网站 | 国产精品sp调教打屁股 |