<span id="mktg5"></span>

<i id="mktg5"><meter id="mktg5"></meter></i>

        <label id="mktg5"><meter id="mktg5"></meter></label>
        最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關鍵字專題關鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
        問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
        當前位置: 首頁 - 科技 - 知識百科 - 正文

        [慢查優化]聯表查詢注意哪位高手是驅動表&amp;amp;amp;你搞不清楚

        來源:懂視網 責編:小采 時間:2020-11-09 14:02:45
        文檔

        [慢查優化]聯表查詢注意哪位高手是驅動表&amp;amp;你搞不清楚

        [慢查優化]聯表查詢注意哪位高手是驅動表&amp;你搞不清楚:[慢查優化]聯表查詢注意誰是驅動表 你搞不清楚誰join誰更好時請放手讓mysql自行判定 寫在前面的話: 。 不要求每個人一定理解 聯表查詢 (join/left join/inner join 等 ) 時的 mysql 運算過程; 。 不要求每個人一定知道線上 (現在或未來) 哪張表數據
        推薦度:
        導讀[慢查優化]聯表查詢注意哪位高手是驅動表&amp;你搞不清楚:[慢查優化]聯表查詢注意誰是驅動表 你搞不清楚誰join誰更好時請放手讓mysql自行判定 寫在前面的話: 。 不要求每個人一定理解 聯表查詢 (join/left join/inner join 等 ) 時的 mysql 運算過程; 。 不要求每個人一定知道線上 (現在或未來) 哪張表數據

        執行計劃為:

        ??? id? select_type? table?? type??? possible_keys?? key????? key_len? ref???????????????????? rows? filtered? Extra???????????????????????? ?
        ------? -----------? ------? ------? --------------? -------? -------? --------------------? ------? --------? -------------------------------
        ???? 1? SIMPLE?????? city??? ref???? ads_id,city_id? city_id? 4??????? const?????????????????? 2838??? 100.00? Using temporary; Using filesort
        ???? 1? SIMPLE?????? ads???? eq_ref? PRIMARY???????? PRIMARY? 4??????? city.ads_id?????? 1??? 100.00? Using where???????????????????

        第二個查詢:

        EXPLAIN extended

        SELECT ads.id

        FROM ads,city?

        WHERE

        ? ?city.city_id =8005

        ? ?AND ads.status = 'online'

        ? ?AND city.ads_id=ads.id

        ORDER BY?city.ads_id?desc

        執行計劃里沒有了using temporary: ??? id? select_type? table?? type??? possible_keys?? key????? key_len? ref???????????????????? rows? filtered? Extra???????????????????? ?
        ------? -----------? ------? ------? --------------? -------? -------? --------------------? ------? --------? ---------------------------
        ???? 1? SIMPLE?????? city??? ref???? ads_id,city_id? city_id? 4??????? const?????????????????? 2838??? 100.00? Using where; Using filesort
        ???? 1? SIMPLE?????? ads??? eq_ref? PRIMARY???????? PRIMARY? 4??????? city.ads_id?????? 1??? 100.00? Using where??????????????? 為什么? ? DBA告訴我們: ? ? MySQL 表關聯的算法是 Nest Loop Join,是通過驅動表的結果集作為循環基礎數據,然后一條一條地通過該結果集中的數據作為過濾條件到下一個表中查詢數據,然后合并結果。 ? EXPLAIN 結果中,第一行出現的表就是驅動表(Important!) ? 以上兩個查詢語句,驅動表都是 city,如上面的執行計劃所示! ? 對驅動表可以直接排序,對非驅動表(的字段排序)需要對循環查詢的合并結果(臨時表)進行排序(Important!) 因此,order by ads.id desc 時,就要先 using temporary 了! ? 驅動表的定義 wwh999?在 2006年總結說,當進行多表連接查詢時,?[驅動表]?的定義為:
        1)指定了聯接條件時,滿足查詢條件的記錄行數少的表為[驅動表];
        2)未指定聯接條件時,行數少的表為[驅動表](Important!)。 ? 忠告:如果你搞不清楚該讓誰做驅動表、誰 join 誰,請讓 MySQL 運行時自行判斷 既然“未指定聯接條件時,行數少的表為[驅動表]”了, 而且你也對自己寫出的復雜的 Nested Loop Join 不太有把握(如下面的實例所示), 就別指定誰 left/right join 誰了, 請交給 MySQL優化器 運行時決定吧。 如果您對自己特別有信心,可以像火丁一樣做優化。 ? 小結果集驅動大結果集 de.cel?在2012年總結說,不管是你,還是 MySQL, 優化的目標是盡可能減少JOIN中Nested Loop的循環次數, 以此保證: 永遠用小結果集驅動大結果集(Important!)!
        ——實例講解—— ? Nested Loop Join慢查SQL語句 先了解一下 mb 表有 千萬級記錄,mbei 表要少得多。慢查實例如下: explain SELECT mb.id, …… FROMmb?LEFT JOIN mbei ON mb.id=mbei.mb_id?INNER JOINu ON mb.uid=u.uid ? WHERE 1=1 ? ORDER BY mbei.apply_time DESC limit 0,10 夠復雜吧。Nested Loop Join 就是這樣, 以驅動表的結果集作為循環的基礎數據,然后將結果集中的數據作為過濾條件一條條地到下一個表中查詢數據,最后合并結果;此時還有第三個表,則將前兩個表的 Join 結果集作為循環基礎數據,再一次通過循環查詢條件到第三個表中查詢數據,如此反復。 這條語句的執行計劃如下: ??? id? select_type? table?? type??? possible_keys?? key???????????? key_len? ref???????????????????? rows? Extra????????????????????????????????????? ?
        ------? -----------? ------? ------? --------------? --------------? -------? -------------------? -------? --------------------------------------------
        ???? 1? SIMPLE?????? mb????? index?? userid????????? userid????????? 4??????? (NULL)?????????????? 6060455? Using index; Using temporary; Using filesort
        ???? 1? SIMPLE?????? mbei??? eq_ref? mb_id? mb_id? 4??????? mb.id???????????? 1???????????????????????????????????????????? ?
        ???? 1? SIMPLE?????? u?????? eq_ref? PRIMARY???????? PRIMARY???????? 4??????? mb.uid??????? 1? Using index???????????????????????????????? 由于動用了“LEFT JOIN”,所以攻城獅已經指定了驅動表,雖然這張驅動表的結果集記錄數達到百萬級! . . 如何優化? . . 優化第一步:LEFT JOIN改為JOIN 干嘛要 left join 啊?直接 join! explain SELECT mb.id……
        FROM mb?JOIN mbei ON mb.id=mbei.mb_id?INNER JOINu ON mb.uid=u.uid ? WHERE 1=1 ? ORDER BY mbei.apply_time DESC limit 0,10 立竿見影,驅動表立刻變為小表 mbei 了, Using temporary 消失了,影響行數少多了: ??? id? select_type? table?? type??? possible_keys?? key????? key_len? ref???????????????????????????? rows? Extra??????? ?
        ------? -----------? ------? ------? --------------? -------? -------? ----------------------------? ------? --------------
        ???? 1? SIMPLE?????? mbei??? ALL???? mb_id? (NULL)?? (NULL)?? (NULL)???????????????????????? 13383? Using filesort
        ???? 1? SIMPLE?????? mb????? eq_ref? PRIMARY,userid? PRIMARY? 4??????? mbei.mb_id?????? 1?????????????? ?
        ???? 1? SIMPLE?????? u?????? eq_ref? PRIMARY???????? PRIMARY? 4??????? mb.uid??????????????? 1? Using index??
        優化第一步之分支1:根據驅動表的字段排序,好嗎? left join不變。干嘛要根據非驅動表的字段排序呢?我們前面說過“對驅動表可以直接排序,對非驅動表(的字段排序)需要對循環查詢的合并結果(臨時表)進行排序!”的。 explain SELECT mb.id……
        FROM mb LEFT JOIN mbei ON mb.id=mbei.mb_id?INNER JOINu ON mb.uid=u.uid ? WHERE 1=1 ? ORDER BY?mb.id DESC limit 0,10 也滿足業務場景,做到了rows最?。???? id? select_type? table?? type??? possible_keys?? key???????????? key_len? ref??????????????????? rows? Extra???? ?
        ------? -----------? ------? ------? --------------? --------------? -------? -------------------? ------? -----------
        ???? 1? SIMPLE?????? mb????? index?? userid????????? PRIMARY???????? 4??????? (NULL)?????????????????? 10??????????? ?
        ???? 1? SIMPLE?????? mbei??? eq_ref? mb_id? mb_id? 4??????? mb.id??????????? 1? Using index
        ???? 1? SIMPLE?????? u?????? eq_ref? PRIMARY???????? PRIMARY???????? 4??????? mb.uid?????? 1? Using index ?
        優化第二步:去除所有JOIN,讓MySQL自行決定! 寫這么多密密麻麻的 left join/inner join 很開心嗎? explain SELECT mb.id……
        FROM mb,mbei,u? ?
        WHERE
        ?? ?mb.id=mbei.mb_id
        ?? ?and mb.uid=u.user_id
        order by mbei.apply_time desc
        limit 0,10 立竿見影,驅動表一樣是小表 mbei: ??? id? select_type? table?? type??? possible_keys?? key????? key_len? ref???????????????????????????? rows? Extra??????? ?
        ------? -----------? ------? ------? --------------? -------? -------? ----------------------------? ------? --------------
        ???? 1? SIMPLE?????? mbei??? ALL???? mb_id? (NULL)?? (NULL)?? (NULL)???????????????????????? 13388? Using filesort
        ???? 1? SIMPLE?????? mb????? eq_ref? PRIMARY,userid? PRIMARY? 4??????? mbei.mb_id?????? 1?????????????? ?
        ???? 1? SIMPLE?????? u?????? eq_ref? PRIMARY???????? PRIMARY? 4??????? mb.uid??????????????? 1? Using index??
        最后的總結: 強調再強調: 不要過于相信你的運氣! 不要相信你的開發環境里SQL的執行速度! 請拿起 explain 武器, 如果你看到以下現象,請優化:
      1. 出現了Using temporary;
      2. rows過多,或者幾乎是全表的記錄數;
      3. key 是 (NULL);
      4. possible_keys 出現過多(待選)索引。
      5. ? 記住,explain 是一種美德! ? ?
        參考資源: 1)wwh999,2006,進行多表查時的排序問題,其多表查詢時的原理論證!?; 2)de.cel,2012,MySQL中的Join 原理及優化思路?; 3)火丁,2013,MySQL優化的奇技淫巧之STRAIGHT_JOIN; ? 贈圖一枚: https://www.gxlcms.com/img/2013/10/18/113350732.gif

        聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

        文檔

        [慢查優化]聯表查詢注意哪位高手是驅動表&amp;amp;你搞不清楚

        [慢查優化]聯表查詢注意哪位高手是驅動表&amp;你搞不清楚:[慢查優化]聯表查詢注意誰是驅動表 你搞不清楚誰join誰更好時請放手讓mysql自行判定 寫在前面的話: 。 不要求每個人一定理解 聯表查詢 (join/left join/inner join 等 ) 時的 mysql 運算過程; 。 不要求每個人一定知道線上 (現在或未來) 哪張表數據
        推薦度:
        標簽: 查詢 注意 驅動
        • 熱門焦點

        最新推薦

        猜你喜歡

        熱門推薦

        專題
        Top
        主站蜘蛛池模板: 四虎最新永久免费视频| 国产午夜精品久久久久免费视| 18国产精品白浆在线观看免费| 亚洲国产精品婷婷久久| 久久国产乱子伦精品免费看| 久久久亚洲欧洲日产国码农村| 精品一区二区三区免费| 亚洲国产香蕉碰碰人人| 久久综合给合久久国产免费| 亚洲一区二区影院| 国产精品免费观看久久| 亚洲国产成人手机在线观看| 日韩特黄特色大片免费视频| 日本视频免费观看| 亚洲精品国产精品乱码在线观看 | 亚洲AV无码不卡在线播放| 成人A片产无码免费视频在线观看| 国产精品亚洲片在线观看不卡 | 亚洲第一成年网站视频| 国产国产成年年人免费看片| 四虎影视久久久免费| 亚洲国产成人高清在线观看| 永久在线观看www免费视频| 亚洲一区二区无码偷拍| 亚洲AV网站在线观看| 两个人看的www免费高清| 亚洲美女精品视频| 国产免费观看黄AV片| 国产午夜无码精品免费看动漫| 2022年亚洲午夜一区二区福利 | 久久久久久a亚洲欧洲AV| 免费A级毛片无码无遮挡内射| 亚洲国产精品成人AV在线| 亚洲精品无码永久中文字幕| 很黄很黄的网站免费的| 四虎精品成人免费视频| 亚洲黄色免费网址| 免费一级特黄特色大片在线| 84pao强力永久免费高清| 污污视频免费观看网站| 亚洲精品在线播放视频|