<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          為什么 MySQL 不推薦使用 join?

          共 1710字,需瀏覽 4分鐘

           ·

          2021-03-31 20:32

          點(diǎn)擊上方“程序員大白”,選擇“星標(biāo)”公眾號(hào)

          重磅干貨,第一時(shí)間送達(dá)

          來(lái)源:cnblogs.com/liboware/p/12740901.html

          1.對(duì)于mysql,不推薦使用子查詢(xún)和join是因?yàn)楸旧韏oin的效率就是硬傷,一旦數(shù)據(jù)量很大效率就很難保證,強(qiáng)烈推薦分別根據(jù)索引單表取數(shù)據(jù),然后在程序里面做join,merge數(shù)據(jù)。

          2.子查詢(xún)就更別用了,效率太差,執(zhí)行子查詢(xún)時(shí),MYSQL需要?jiǎng)?chuàng)建臨時(shí)表,查詢(xún)完畢后再刪除這些臨時(shí)表,所以,子查詢(xún)的速度會(huì)受到一定的影響,這里多了一個(gè)創(chuàng)建和銷(xiāo)毀臨時(shí)表的過(guò)程。

          3.如果是JOIN的話,它是走嵌套查詢(xún)的。小表驅(qū)動(dòng)大表,且通過(guò)索引字段進(jìn)行關(guān)聯(lián)。如果表記錄比較少的話,還是OK的。大的話業(yè)務(wù)邏輯中可以控制處理。

          4.數(shù)據(jù)庫(kù)是最底層的,瓶頸往往是數(shù)據(jù)庫(kù)。建議數(shù)據(jù)庫(kù)只是作為數(shù)據(jù)store的工具,而不要添加業(yè)務(wù)上去。

          一、應(yīng)用層關(guān)聯(lián)的優(yōu)勢(shì)

          讓緩存的效率更高。許多應(yīng)用程序可以方便地緩存單表查詢(xún)對(duì)應(yīng)的結(jié)果對(duì)象。如果關(guān)聯(lián)中的某個(gè)表發(fā)生了變化,那么就無(wú)法使用查詢(xún)緩存了,而拆分后,如果某個(gè)表很少改變,那么基于該表的查詢(xún)就可以重復(fù)利用查詢(xún)緩存結(jié)果了。

          • 將查詢(xún)分解后,執(zhí)行單個(gè)查詢(xún)可以減少鎖的競(jìng)爭(zhēng)。
          • 在應(yīng)用層做關(guān)聯(lián),可以更容易對(duì)數(shù)據(jù)庫(kù)進(jìn)行拆分,更容易做到高性能和可擴(kuò)展。
          • 查詢(xún)本身效率也可能會(huì)有所提升。查詢(xún)id集的時(shí)候,使用IN()代替關(guān)聯(lián)查詢(xún),可以讓MySQL按照ID順序進(jìn)行查詢(xún),這可能比隨機(jī)的關(guān)聯(lián)要更高效。
          • 可以減少冗余記錄的查詢(xún)。在應(yīng)用層做關(guān)聯(lián)查詢(xún),意味著對(duì)于某條記錄應(yīng)用只需要查詢(xún)一次,而在數(shù)據(jù)庫(kù)中做關(guān)聯(lián)查詢(xún),則可能需
          • 要重復(fù)地訪問(wèn)一部分?jǐn)?shù)據(jù)。從這點(diǎn)看,這樣的重構(gòu)還可能會(huì)減少網(wǎng)絡(luò)和內(nèi)存的消艷。
          • 更進(jìn)一步,這樣做相當(dāng)于在應(yīng)用中實(shí)現(xiàn)了哈希關(guān)聯(lián),而不是使用MySQL的嵌套循環(huán)關(guān)聯(lián)。某些場(chǎng)景哈希關(guān)聯(lián)的效率要高很多。

          二、應(yīng)用層關(guān)聯(lián)的使用場(chǎng)景

          • 當(dāng)應(yīng)用能夠方便地緩存單個(gè)查詢(xún)的結(jié)果的時(shí)候
          • 當(dāng)可以將數(shù)據(jù)分布到不同的MySQL服務(wù)器上的時(shí)候
          • 當(dāng)能夠使用IN()的方式代替關(guān)聯(lián)查詢(xún)的時(shí)候
          • 并發(fā)場(chǎng)景多,DB查詢(xún)頻繁,需要分庫(kù)分表

          三、不推薦使用join的原因

          1.DB承擔(dān)的業(yè)務(wù)壓力大,能減少負(fù)擔(dān)就減少。當(dāng)表處于百萬(wàn)級(jí)別后,join導(dǎo)致性能下降;

          2.分布式的分庫(kù)分表。這種時(shí)候是不建議跨庫(kù)join的。目前mysql的分布式中間件,跨庫(kù)join表現(xiàn)不良。

          3.修改表的schema,單表查詢(xún)的修改比較容易,join寫(xiě)的sql語(yǔ)句要修改,不容易發(fā)現(xiàn),成本比較大,當(dāng)系統(tǒng)比較大時(shí),不好維護(hù)。

          推薦閱讀:圖解 5 種 Join 連接及實(shí)戰(zhàn)案例

          四、不使用join的解決方案

          在業(yè)務(wù)層,單表查詢(xún)出數(shù)據(jù)后,作為條件給下一個(gè)單表查詢(xún)。也就是子查詢(xún)。會(huì)擔(dān)心子查詢(xún)出來(lái)的結(jié)果集太多。mysql對(duì)in的數(shù)量沒(méi)有限制,但是mysql限制整條sql語(yǔ)句的大小。

          通過(guò)調(diào)整參數(shù)max_allowed_packet ,可以修改一條sql的最大值。建議在業(yè)務(wù)上做好處理,限制一次查詢(xún)出來(lái)的結(jié)果集是能接受的。

          五、join查詢(xún)的優(yōu)勢(shì)

          關(guān)聯(lián)查詢(xún)的好處是可以做分頁(yè),可以用副表的字段做查詢(xún)條件,在查詢(xún)的時(shí)候,將副表匹配到的字段作為結(jié)果集,用主表去in它。

          但是問(wèn)題來(lái)了,如果匹配到的數(shù)據(jù)量太大就不行了,也會(huì)導(dǎo)致返回的分頁(yè)記錄跟實(shí)際的不一樣,解決的方法可以交給前端,一次性查詢(xún),讓前端分批顯示就可以了,這種解決方案的前提是數(shù)據(jù)量不太,因?yàn)閟ql本身長(zhǎng)度有限。


          國(guó)產(chǎn)小眾瀏覽器因屏蔽視頻廣告,被索賠100萬(wàn)(后續(xù))

          年輕人“不講武德”:因看黃片上癮,把網(wǎng)站和786名女主播起訴了

          中國(guó)聯(lián)通官網(wǎng)被發(fā)現(xiàn)含木馬腳本,可向用戶(hù)推廣色情APP

          張一鳴:每個(gè)逆襲的年輕人,都具備的底層能力


          關(guān)


          ,學(xué)西學(xué)學(xué)運(yùn)營(yíng)護(hù)號(hào),樂(lè)質(zhì),結(jié)識(shí),關(guān)[],學(xué)習(xí)進(jìn)!


          瀏覽 46
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  亚洲精品在线视频播放平台 | 翔田千里无码播放 | 一级A片一毛片大全 | 成人A√在线 | 女人18片毛片120分钟免费观看 |