亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

join 優化的基本原則有哪些

發布時間:2021-11-08 09:22:42 來源:億速云 閱讀:228 作者:小新 欄目:MySQL數據庫

這篇文章給大家分享的是有關join 優化的基本原則有哪些的內容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。

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 優化的基本原則有哪些”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

芜湖市| 济宁市| 南京市| 法库县| 偃师市| 邮箱| 水城县| 永丰县| 浪卡子县| 平南县| 腾冲县| 达日县| 土默特左旗| 莱阳市| 新田县| 永州市| 竹溪县| 江北区| 淳化县| 宁南县| 象州县| 武冈市| 平原县| 建阳市| 牡丹江市| 涞源县| 肃南| 景德镇市| 济宁市| 怀仁县| 隆林| 尤溪县| 三穗县| 新沂市| 定安县| 长海县| 同心县| 莱州市| 黔西县| 苗栗市| 桃园县|