98国产在线视频福利_欧亚v视频日韩一区二区_国产在线精彩视频_亚洲伊人久久综合影院_亚洲欧美高清激情精品一区_少妇熟女天堂网av_午夜福利日本专区_中美女子成人毛片_大荫蒂毛茸茸视频国产_小14萝裸体自慰洗澡大尺度
登錄
注冊
關(guān)于我們
簡(jiǎn)體中文
ENGLISH
搜索
購物車(chē)
0 ITEMS ON YOUR CART
去購物車(chē)結算
合計:
¥0
首頁(yè)
動(dòng)態(tài)
方案
案例
專(zhuān)欄
期刊
聯(lián)系我們
首頁(yè)
期刊
我們?yōu)槭裁匆謳旆直恚?
MySQL知識大全
21個(gè)MySQL表設計的經(jīng)驗準則
我們?yōu)槭裁匆謳旆直恚?/a>
CmsWing
我們?yōu)槭裁匆謳旆直恚?/h2>
### 前言 今天跟大家聊聊分庫分表。 - 什么是分庫分表 - 為什么需要分庫分表 - 如何分庫分表 - 什么時(shí)候開(kāi)始考慮分庫分表 - 分庫分表會(huì )導致哪些問(wèn)題 - 分庫分表中間件簡(jiǎn)介 ### 1. 什么是分庫分表 分庫:就是一個(gè)數據庫分成多個(gè)數據庫,部署到不同機器。 ![](/upload/picture/2022-09-30/upload_3e5a613ec9554a06667e858a947c9647.png) 分表:就是一個(gè)數據庫表分成多個(gè)表。 ![](/upload/picture/2022-09-30/upload_13a011a61f9ab74bd85b7b3cdae365e7.png) ### 2. 為什么需要分庫分表 #### 2.1 為什么需要分庫呢? 如果業(yè)務(wù)量劇增,數據庫可能會(huì )出現性能瓶頸,這時(shí)候我們就需要考慮拆分數據庫。從這幾方面來(lái)看: - 磁盤(pán)存儲 業(yè)務(wù)量劇增,MySQL單機磁盤(pán)容量會(huì )撐爆,拆成多個(gè)數據庫,磁盤(pán)使用率大大降低。 - 并發(fā)連接支撐 我們知道數據庫連接是有限的。在高并發(fā)的場(chǎng)景下,大量請求訪(fǎng)問(wèn)數據庫,MySQL單機是扛不住的!當前非?;鸬奈⒎?wù)架構出現,就是為了應對高并發(fā)。它把訂單、用戶(hù)、商品等不同模塊,拆分成多個(gè)應用,并且把單個(gè)數據庫也拆分成多個(gè)不同功能模塊的數據庫(訂單庫、用戶(hù)庫、商品庫),以分擔讀寫(xiě)壓力。 #### 2.2 為什么需要分表? 數據量太大的話(huà),SQL的查詢(xún)就會(huì )變慢。如果一個(gè)查詢(xún)SQL沒(méi)命中索引,千百萬(wàn)數據量級別的表可能會(huì )拖垮整個(gè)數據庫。 即使SQL命中了索引,如果表的數據量超過(guò)一千萬(wàn)的話(huà),查詢(xún)也是會(huì )明顯變慢的。這是因為索引一般是B+樹(shù)結構,數據千萬(wàn)級別的話(huà),B+樹(shù)的高度會(huì )增高,查詢(xún)就變慢啦。 **小伙伴們是否還記得,MySQL的B+樹(shù)的高度怎么計算的呢?** 順便復習一下吧 InnoDB存儲引擎最小儲存單元是頁(yè),一頁(yè)大小就是16k。B+樹(shù)葉子存的是數據,內部節點(diǎn)存的是鍵值+指針。索引組織表通過(guò)非葉子節點(diǎn)的二分查找法以及指針確定數據在哪個(gè)頁(yè)中,進(jìn)而再去數據頁(yè)中找到需要的數據,B+樹(shù)結構圖如下: ![](/upload/picture/2022-09-30/upload_a0c2eb3272f2e808c0884a0c8f35a5cd.png) 假設B+樹(shù)的高度為2的話(huà),即有一個(gè)根結點(diǎn)和若干個(gè)葉子結點(diǎn)。這棵B+樹(shù)的存放總記錄數為=根結點(diǎn)指針數*單個(gè)葉子節點(diǎn)記錄行數。 如果一行記錄的數據大小為1k,那么單個(gè)葉子節點(diǎn)可以存的記錄數 =16k/1k =16. 非葉子節點(diǎn)內存放多少指針呢?我們假設主鍵ID為bigint類(lèi)型,長(cháng)度為8字節(面試官問(wèn)你int類(lèi)型,一個(gè)int就是32位,4字節),而指針大小在InnoDB源碼中設置為6字節,所以就是 8+6=14 字節,16k/14B =16*1024B/14B = 1170 因此,一棵高度為2的B+樹(shù),能存放1170 * 16=18720條這樣的數據記錄。同理一棵高度為3的B+樹(shù),能存放1170 *1170 *16 =21902400,大概可以存放兩千萬(wàn)左右的記錄。B+樹(shù)高度一般為1-3層,如果B+到了4層,查詢(xún)的時(shí)候會(huì )多查磁盤(pán)的次數,SQL就會(huì )變慢。 因此單表數據量太大,SQL查詢(xún)會(huì )變慢,所以就需要考慮分表啦。 ### 3. 如何分庫分表 #### 3.1 垂直拆分 ![](/upload/picture/2022-09-30/upload_9648d80bd4b53895bd0ada3c2fa14522.png) 3.1.1 垂直分庫 在業(yè)務(wù)發(fā)展初期,業(yè)務(wù)功能模塊比較少,為了快速上線(xiàn)和迭代,往往采用單個(gè)數據庫來(lái)保存數據。數據庫架構如下: ![](/upload/picture/2022-09-30/upload_9fbebf4be379bff33f804a8d25e60d18.png) 但是隨著(zhù)業(yè)務(wù)蒸蒸日上,系統功能逐漸完善。這時(shí)候,可以按照系統中的不同業(yè)務(wù)進(jìn)行拆分,比如拆分成用戶(hù)庫、訂單庫、積分庫、商品庫,把它們部署在不同的數據庫服務(wù)器,這就是垂直分庫。 垂直分庫,將原來(lái)一個(gè)單數據庫的壓力分擔到不同的數據庫,可以很好應對高并發(fā)場(chǎng)景。數據庫垂直拆分后的架構如下: 圖片 ##### 3.1.2 垂直分表 如果一個(gè)單表包含了幾十列甚至上百列,管理起來(lái)很混亂,每次都select *的話(huà),還占用IO資源。這時(shí)候,我們可以將一些不常用的、數據較大或者長(cháng)度較長(cháng)的列拆分到另外一張表。 比如一張用戶(hù)表,它包含user_id、user_name、mobile_no、age、email、nickname、address、user_desc,如果email、address、user_desc等字段不常用,我們可以把它拆分到另外一張表,命名為用戶(hù)詳細信息表。這就是垂直分表 ![](/upload/picture/2022-09-30/upload_c352e50aa0c53c8df16465b789864eca.png) #### 3.2 水平拆分 #### 3.2.1 水平分庫 水平分庫是指,將表的數據量切分到不同的數據庫服務(wù)器上,每個(gè)服務(wù)器具有相同的庫和表,只是表中的數據集合不一樣。它可以有效的緩解單機單庫的性能瓶頸和壓力。 用戶(hù)庫的水平拆分架構如下: ![](/upload/picture/2022-09-30/upload_a93696c641c611d38bcf95d2c6584b1d.png) #### 3.2.2 水平分表 如果一個(gè)表的數據量太大,可以按照某種規則(如hash取模、range),把數據切分到多張表去。 一張訂單表,按時(shí)間range拆分如下: 圖片 #### 3.3. 水平分庫分表策略 分庫分表策略一般有幾種,使用與不同的場(chǎng)景: range范圍 hash取模 range+hash取?;旌? #### 3.3.1 range范圍 range,即范圍策略劃分表。比如我們可以將表的主鍵,按照從0~1000萬(wàn)的劃分為一個(gè)表,1000~2000萬(wàn)劃分到另外一個(gè)表。如下圖: 圖片 當然,有時(shí)候我們也可以按時(shí)間范圍來(lái)劃分,如不同年月的訂單放到不同的表,它也是一種range的劃分策略。 這種方案的優(yōu)點(diǎn): 這種方案有利于擴容,不需要數據遷移。假設數據量增加到5千萬(wàn),我們只需要水平增加一張表就好啦,之前0~4000萬(wàn)的數據,不需要遷移。 缺點(diǎn): 這種方案會(huì )有熱點(diǎn)問(wèn)題,因為訂單id是一直在增大的,也就是說(shuō)最近一段時(shí)間都是匯聚在一張表里面的。比如最近一個(gè)月的訂單都在1000萬(wàn)~2000萬(wàn)之間,平時(shí)用戶(hù)一般都查最近一個(gè)月的訂單比較多,請求都打到order_1表啦,這就導致數據熱點(diǎn)問(wèn)題。 #### 3.3.2 hash取模 hash取模策略:指定的路由key(一般是user_id、訂單id作為key)對分表總數進(jìn)行取模,把數據分散到各個(gè)表中。 比如原始訂單表信息,我們把它分成4張分表: 圖片 比如id=1,對4取模,就會(huì )得到1,就把它放到t_order_1; id=3,對4取模,就會(huì )得到3,就把它放到t_order_3; 這種方案的優(yōu)點(diǎn): hash取模的方式,不會(huì )存在明顯的熱點(diǎn)問(wèn)題。 缺點(diǎn): 如果一開(kāi)始按照hash取模分成4個(gè)表了,未來(lái)某個(gè)時(shí)候,表數據量又到瓶頸了,需要擴容,這就比較棘手了。比如你從4張表,又擴容成8張表,那之前id=5的數據是在(5%4=1,即t_order_1),現在應該放到(5%8=5,即t_order_5),也就是說(shuō)歷史數據要做遷移了。 ##### 3.3.3 range+hash取?;旌? 既然range存在熱點(diǎn)數據問(wèn)題,hash取模擴容遷移數據比較困難,我們可以綜合兩種方案一起嘛,取之之長(cháng),棄之之短。 比較簡(jiǎn)單的做法就是,在拆分庫的時(shí)候,我們可以先用range范圍方案,比如訂單id在0~4000萬(wàn)的區間,劃分為訂單庫1;id在4000萬(wàn)~8000萬(wàn)的數據,劃分到訂單庫2,將來(lái)要擴容時(shí),id在8000萬(wàn)~1.2億的數據,劃分到訂單庫3。然后訂單庫內,再用hash取模的策略,把不同訂單劃分到不同的表。 圖片 ### 4. 什么時(shí)候才考慮分庫分表呢? #### 4.1 什么時(shí)候分表? 如果你的系統處于快速發(fā)展時(shí)期,如果每天的訂單流水都新增幾十萬(wàn),并且,訂單表的查詢(xún)效率明變慢時(shí),就需要規劃分庫分表了。一般B+樹(shù)索引高度是2~3層最佳,如果數據量千萬(wàn)級別,可能高度就變4層了,數據量就會(huì )明顯變慢了。不過(guò)業(yè)界流傳,一般500萬(wàn)數據就要考慮分表了。 #### 4.2 什么時(shí)候分庫 業(yè)務(wù)發(fā)展很快,還是多個(gè)服務(wù)共享一個(gè)單體數據庫,數據庫成為了性能瓶頸,就需要考慮分庫了。比如訂單、用戶(hù)等,都可以抽取出來(lái),新搞個(gè)應用(其實(shí)就是微服務(wù)思想),并且拆分數據庫(訂單庫、用戶(hù)庫)。 ### 5. 分庫分表會(huì )導致哪些問(wèn)題 分庫分表之后,也會(huì )存在一些問(wèn)題: 事務(wù)問(wèn)題 跨庫關(guān)聯(lián) 排序問(wèn)題 分頁(yè)問(wèn)題 分布式ID #### 5.1 事務(wù)問(wèn)題 分庫分表后,假設兩個(gè)表在不同的數據庫,那么本地事務(wù)已經(jīng)無(wú)效啦,需要使用分布式事務(wù)了。 #### 5.2 跨庫關(guān)聯(lián) 跨節點(diǎn)Join的問(wèn)題:解決這一問(wèn)題可以分兩次查詢(xún)實(shí)現 ##### 1. 5.3 排序問(wèn)題 跨節點(diǎn)的count,order by,group by以及聚合函數等問(wèn)題:可以分別在各個(gè)節點(diǎn)上得到結果后在應用程序端進(jìn)行合并。 ##### 1. 5.4 分頁(yè)問(wèn)題 方案1:在個(gè)節點(diǎn)查到對應結果后,在代碼端匯聚再分頁(yè)。 方案2:把分頁(yè)交給前端,前端傳來(lái)pageSize和pageNo,在各個(gè)數據庫節點(diǎn)都執行分頁(yè),然后匯聚總數量前端。這樣缺點(diǎn)就是會(huì )造成空查,如果分頁(yè)需要排序,也不好搞。 1. 5.5 分布式ID 數據庫被切分后,不能再依賴(lài)數據庫自身的主鍵生成機制啦,最簡(jiǎn)單可以考慮UUID,或者使用雪花算法生成分布式ID。 ### 6. 分庫分表中間件 目前流行的分庫分表中間件比較多: - cobar - Mycat - Sharding-JDBC - Atlas - TDDL(淘寶) - vitess ![](/upload/picture/2022-09-30/upload_18b2fa580c04655e887ed71eeabd86fa.png) 最后 ------------ ### 參考文獻 [我們?yōu)槭裁匆謳旆直??](https://mp.weixin.qq.com/s?__biz=Mzg3NzU5NTIwNg==&mid=2247498625&idx=1&sn=0d7bd9d1b46eeff4c715a6761355e9b0&chksm=cf2224a8f855adbea8931c8e011711f6c70cffeef8ddf8b87729c710eacef11b46eef80fda36&token=1894891884&lang=zh_CN&scene=21#wechat_redirect "我們?yōu)槭裁匆謳旆直恚?)
← 上一篇:工業(yè)ERP系統五十問(wèn)...
下一篇:MySQL知識大全... →
網(wǎng)站導航
首頁(yè)
動(dòng)態(tài)
方案
案例
專(zhuān)欄
期刊
聯(lián)系我們