<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>

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

          共 2097字,需瀏覽 5分鐘

           ·

          2021-03-02 23:08

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

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

          今日推薦:寫博客能月入 10K?

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

          前言

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

          對(duì)比

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