1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        為什么強(qiáng)烈建議你不要做聯(lián)表查詢(xún)?

        共 2097字,需瀏覽 5分鐘

         ·

        2021-03-02 23:08

        點(diǎn)擊上方 好好學(xué)java ,選擇 星標(biāo) 公眾號(hào)

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

        今日推薦:寫(xiě)博客能月入 10K?

        個(gè)人原創(chuàng)100W +訪問(wèn)量博客:點(diǎn)擊前往,查看更多

        前言

        一直想要聊一聊關(guān)于開(kāi)發(fā)中更建議使用單表查詢(xún)+代碼層組裝 or 聯(lián)表查詢(xún) 的問(wèn)題,在開(kāi)發(fā)中每個(gè)同學(xué)的開(kāi)發(fā)中有各自的習(xí)慣,筆者在公司也和一些同事關(guān)于這方面有一些探討。
        關(guān)于本文,更像是一些個(gè)人的看法,想到什么說(shuō)什么,一定有不同的意見(jiàn),歡迎大家留言,一起討論。

        對(duì)比

        在實(shí)際開(kāi)發(fā)中,我們不可避免的要關(guān)聯(lián)幾張數(shù)據(jù)表來(lái)合成最終的展示數(shù)據(jù),如:
        select * from tag
        join tag_post on tag_post.tag_id=tag.id
        join post on tag_post.post_id=post.id
        where tag.tag='mysql';
        同樣的,我們可以用以下查詢(xún)來(lái)代替:
        select * from tag where tag='mysql';

        select * from tag_post where tag_id=1234;

        select * from post where id in(123,456,567,9989,8909);
        看似后者查詢(xún)步驟更多了,原本一個(gè)方法查詢(xún)就能出結(jié)果,現(xiàn)在直接變成三個(gè)。但是這樣做的好處是:
        1、單表查詢(xún)更利于后續(xù)的維護(hù)。
        在實(shí)際開(kāi)發(fā)場(chǎng)景中,在代碼初步開(kāi)發(fā)階段(如果攤上一個(gè)不太靠譜的產(chǎn)品),業(yè)務(wù)發(fā)生變動(dòng),某張表的結(jié)構(gòu)發(fā)生變動(dòng),很可能整個(gè)join查詢(xún)都變得不可用,復(fù)雜的關(guān)聯(lián)查詢(xún),在修改時(shí),基本等于推倒重來(lái)。
        但是如果我們使用了單表查詢(xún),拆成上訴例子中的三個(gè)步驟,我們可能只需要修改其中的一個(gè)步驟即可,比較利于維護(hù)。
        2、代碼可復(fù)用性高
        這個(gè)不用多說(shuō),join聯(lián)表的SQL,基本不太可能被復(fù)用,但是拆分后的單表查詢(xún),比如上面例子中,我查詢(xún)出tab數(shù)據(jù),任何地方組裝需要tab數(shù)據(jù),我都不需要再次做相關(guān)查詢(xún),直接使用。
        3、效率問(wèn)題
        join聯(lián)表查詢(xún),小表驅(qū)動(dòng)大表,通過(guò)索引字段進(jìn)行關(guān)聯(lián)。如果表記錄比較少的話,效率還是OK的,有時(shí)效率超過(guò)單表查詢(xún)。但是如果數(shù)據(jù)量上去,多表查詢(xún)是笛卡爾乘積方式,需要檢索的數(shù)據(jù)是幾何倍上升的。另外多表查詢(xún)索引設(shè)計(jì)上也考驗(yàn)開(kāi)發(fā)者的功底,索引設(shè)計(jì)不合理,大數(shù)據(jù)量下的多表查詢(xún),很可能把數(shù)據(jù)庫(kù)拖垮。
        相比而言,拆分成單表查詢(xún)+代碼上組裝,業(yè)務(wù)邏輯更清晰,優(yōu)化更方便,單個(gè)表的索引設(shè)計(jì)上也更簡(jiǎn)單。用多幾行代碼,多幾次數(shù)據(jù)庫(kù)查詢(xún)換取這些優(yōu)點(diǎn),還是很值得的。
        4、減少冗余字段的查詢(xún)
        在很多業(yè)務(wù)中,我們可能對(duì)某條記錄只需要查詢(xún)一次,此時(shí)如何使用關(guān)聯(lián)查詢(xún),則不可避免的需要重復(fù)地訪問(wèn)一部分?jǐn)?shù)據(jù),從而可能會(huì)加劇網(wǎng)絡(luò)和內(nèi)存的消耗。
        5、緩存利用率更高
        比如上面查詢(xún)中的tag是不常變動(dòng)的數(shù)據(jù),緩存下來(lái),每次查詢(xún)就可以跳過(guò)第一條查詢(xún)語(yǔ)句。而關(guān)聯(lián)查詢(xún),任何一張表的數(shù)據(jù)變動(dòng)都會(huì)引起緩存結(jié)果的失效,緩存利用率不會(huì)很高。
        6、其他
        數(shù)據(jù)庫(kù)資源比較寶貴,很多系統(tǒng)的瓶頸就在數(shù)據(jù)庫(kù)上,很多復(fù)雜的邏輯我們?cè)赟ervice做,不在數(shù)據(jù)庫(kù)處理會(huì)更好。
        在后續(xù)數(shù)據(jù)量上去,需要分庫(kù)分表時(shí),Join查詢(xún)更不利于分庫(kù)分表,目前MySQL的分布式中間件,跨庫(kù)join表現(xiàn)不良。
        單表查詢(xún)+代碼上組裝相當(dāng)于解耦,現(xiàn)在開(kāi)發(fā)中,我們常常使用各種ORM框架,不知道你的聯(lián)查orm給你搞成了什么樣,你是很難直接優(yōu)化。
        以上理由,強(qiáng)烈推薦在今后的開(kāi)發(fā)中,盡可能的使用單表查詢(xún)+代碼上組裝的方式。使用Stream lambda + mybatis plus + lombok, 酸爽!

        單表 VS 聯(lián)表

        基本就這些了,你的看法呢?
        推薦文章
        更多項(xiàng)目源碼

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

        手機(jī)掃一掃分享

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

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            日韩免费一级片 | 国产成人自拍偷拍 | 《喜爱夜蒲》大尺度视频 | 91麻豆国产自产在线观看 | 男女互插网站 | 在线免费看操逼 | 极品最强网红八月未央 | 伊人成人网视频 | 日韩高清二区 | 久久99影院 |