色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

你們知道為什么要分庫分表嗎

上海磐啟微電子有限公司 ? 來源:愛笑的架構師 ? 作者:雷架 ? 2021-08-16 10:37 ? 次閱讀

在文章開頭先拋幾個問題:

(1)什么時候才需要分庫分表呢?我們的評判標準是什么?

(2)一張表存儲了多少數據的時候,才需要考慮分庫分表?

(3)數據增長速度很快,每天產生多少數據,才需要考慮做分庫分表?

這些問題你都搞清楚了嗎?相信看完這篇文章會有答案。

為什么要分庫分表?

首先回答一下為什么要分庫分表,答案很簡單:數據庫出現性能瓶頸。用大白話來說就是數據庫快扛不住了。

數據庫出現性能瓶頸,對外表現有幾個方面:

大量請求阻塞

在高并發場景下,大量請求都需要操作數據庫,導致連接數不夠了,請求處于阻塞狀態。

SQL 操作變慢

如果數據庫中存在一張上億數據量的表,一條 SQL 沒有命中索引會全表掃描,這個查詢耗時會非常久。

存儲出現問題

業務量劇增,單庫數據量越來越大,給存儲造成巨大壓力。

從機器的角度看,性能瓶頸無非就是CPU、內存、磁盤、網絡這些,要解決性能瓶頸最簡單粗暴的辦法就是提升機器性能,但是通過這種方法成本和收益投入比往往又太高了,不劃算,所以重點還是要從軟件角度入手。

數據庫相關優化方案

數據庫優化方案很多,主要分為兩大類:軟件層面、硬件層面。

軟件層面包括:SQL 調優、表結構優化、讀寫分離、數據庫集群、分庫分表等;

硬件層面主要是增加機器性能。

SQL 調優

SQL 調優往往是解決數據庫問題的第一步,往往投入少部分精力就能獲得較大的收益。

SQL 調優主要目的是盡可能的讓那些慢 SQL 變快,手段其實也很簡單就是讓 SQL 執行盡量命中索引。

開啟慢 SQL 記錄

如果你使用的是 Mysql,需要在 Mysql 配置文件中配置幾個參數即可。

slow_query_log=on

long_query_time=1

slow_query_log_file=/path/to/log

調優的工具

常常會用到 explain 這個命令來查看 SQL 語句的執行計劃,通過觀察執行結果很容易就知道該 SQL 語句是不是全表掃描、有沒有命中索引。

select id, age, gender from user where name = ‘愛笑的架構師’;

返回有一列叫“type”,常見取值有:

ALL、index、range、 ref、eq_ref、const、system、NULL(從左到右,性能從差到好)

ALL 代表這條 SQL 語句全表掃描了,需要優化。一般來說需要達到range 級別及以上。

表結構優化

以一個場景舉例說明:

“user”表中有 user_id、nickname 等字段,“order”表中有order_id、user_id等字段,如果想拿到用戶昵稱怎么辦?一般情況是通過 join 關聯表操作,在查詢訂單表時關聯查詢用戶表,從而獲取導用戶昵稱。

但是隨著業務量增加,訂單表和用戶表肯定也是暴增,這時候通過兩個表關聯數據就比較費力了,為了取一個昵稱字段而不得不關聯查詢幾十上百萬的用戶表,其速度可想而知。

這個時候可以嘗試將 nickname 這個字段加到 order 表中(order_id、user_id、nickname),這種做法通常叫做數據庫表冗余字段。這樣做的好處展示訂單列表時不需要再關聯查詢用戶表了。

冗余字段的做法也有一個弊端,如果這個字段更新會同時涉及到多個表的更新,因此在選擇冗余字段時要盡量選擇不經常更新的字段。

架構優化

當單臺數據庫實例扛不住,我們可以增加實例組成集群對外服務。

當發現讀請求明顯多于寫請求時,我們可以讓主實例負責寫,從實例對外提供讀的能力;

如果讀實例壓力依然很大,可以在數據庫前面加入緩存如 redis,讓請求優先從緩存取數據減少數據庫訪問。

緩存分擔了部分壓力后,數據庫依然是瓶頸,這個時候就可以考慮分庫分表的方案了,后面會詳細介紹。

硬件優化

硬件成本非常高,一般來說不可能遇到數據庫性能瓶頸就去升級硬件。

在前期業務量比較小的時候,升級硬件數據庫性能可以得到較大提升;但是在后期,升級硬件得到的收益就不那么明顯了。

分庫分表詳解

下面我們以一個商城系統為例逐步講解數據庫是如何一步步演進。

單應用單數據庫

在早期創業階段想做一個商城系統,基本就是一個系統包含多個基礎功能模塊,最后打包成一個 war 包部署,這就是典型的單體架構應用。

如上圖,商城系統包括主頁 Portal 模板、用戶模塊、訂單模塊、庫存模塊等,所有的模塊都共有一個數據庫,通常數據庫中有非常多的表。

因為用戶量不大,這樣的架構在早期完全適用,開發者可以拿著 demo到處找(騙)投資人。

一旦拿到投資人的錢,業務就要開始大規模推廣,同時系統架構也要匹配業務的快速發展。

多應用單數據庫

在前期為了搶占市場,這一套系統不停地迭代更新,代碼量越來越大,架構也變得越來越臃腫,現在隨著系統訪問壓力逐漸增加,系統拆分就勢在必行了。

為了保證業務平滑,系統架構重構也是分了幾個階段進行。

第一個階段將商城系統單體架構按照功能模塊拆分為子服務,比如:Portal 服務、用戶服務、訂單服務、庫存服務等。

如上圖,多個服務共享一個數據庫,這樣做的目的是底層數據庫訪問邏輯可以不用動,將影響降到最低。

多應用多數據庫

隨著業務推廣力度加大,數據庫終于成為了瓶頸,這個時候多個服務共享一個數據庫基本不可行了。我們需要將每個服務相關的表拆出來單獨建立一個數據庫,這其實就是“分庫”了。

單數據庫的能夠支撐的并發量是有限的,拆成多個庫可以使服務間不用競爭,提升服務的性能。

如上圖,從一個大的數據中分出多個小的數據庫,每個服務都對應一個數據庫,這就是系統發展到一定階段必要要做的“分庫”操作。

現在非常火的微服務架構也是一樣的,如果只拆分應用不拆分數據庫,不能解決根本問題,整個系統也很容易達到瓶頸。

分表

說完了分庫,那什么時候分表呢?

如果系統處于高速發展階段,拿商城系統來說,一天下單量可能幾十萬,那數據庫中的訂單表增長就特別快,增長到一定階段數據庫查詢效率就會出現明顯下降。

因此,當單表數據增量過快,業界流傳是超過500萬的數據量就要考慮分表了。當然500萬只是一個經驗值,大家可以根據實際情況做出決策。

那如何分表呢?

分表有幾個維度,一是水平切分和垂直切分,二是單庫內分表和多庫內分表。

水平拆分和垂直拆分

就拿用戶表(user)來說,表中有7個字段:id,name,age,sex,nickname,description,如果 nickname 和 description 不常用,我們可以將其拆分為另外一張表:用戶詳細信息表,這樣就由一張用戶表拆分為了用戶基本信息表+用戶詳細信息表,兩張表結構不一樣相互獨立。但是從這個角度來看垂直拆分并沒有從根本上解決單表數據量過大的問題,因此我們還是需要做一次水平拆分。

還有一種拆分方法,比如表中有一萬條數據,我們拆分為兩張表,id 為奇數的:1,3,5,7……放在 user1, id 為偶數的:2,4,6,8……放在 user2中,這樣的拆分辦法就是水平拆分了。

水平拆分的方式也很多,除了上面說的按照 id 拆表,還可以按照時間維度取拆分,比如訂單表,可以按每日、每月等進行拆分。

每日表:只存儲當天的數據。

每月表:可以起一個定時任務將前一天的數據全部遷移到當月表。

歷史表:同樣可以用定時任務把時間超過 30 天的數據遷移到 history表。

總結一下水平拆分和垂直拆分的特點:

垂直切分:基于表或字段劃分,表結構不同。

水平切分:基于數據劃分,表結構相同,數據不同。

單庫內拆分和多庫拆分

拿水平拆分為例,每張表都拆分為了多個子表,多個子表存在于同一數據庫中。比如下面用戶表拆分為用戶1表、用戶2表。

在一個數據庫中將一張表拆分為幾個子表在一定程度上可以解決單表查詢性能的問題,但是也會遇到一個問題:單數據庫存儲瓶頸。

所以在業界用的更多的還是將子表拆分到多個數據庫中。比如下圖中,用戶表拆分為兩個子表,兩個子表分別存在于不同的數據庫中。

一句話總結:分表主要是為了減少單張表的大小,解決單表數據量帶來的性能問題。

分庫分表帶來的復雜性

既然分庫分表這么好,那我們是不是在項目初期就應該采用這種方案呢?不要激動,冷靜一下,分庫分表的確解決了很多問題,但是也給系統帶來了很多復雜性,下面簡要說一說。

(1)跨庫關聯查詢

在單庫未拆分表之前,我們可以很方便使用 join 操作關聯多張表查詢數據,但是經過分庫分表后兩張表可能都不在一個數據庫中,如何使用 join 呢?

有幾種方案可以解決:

字段冗余:把需要關聯的字段放入主表中,避免 join 操作;

數據抽象:通過ETL等將數據匯合聚集,生成新的表;

全局表:比如一些基礎表可以在每個數據庫中都放一份;

應用層組裝:將基礎數據查出來,通過應用程序計算組裝;

(2)分布式事務

單數據庫可以用本地事務搞定,使用多數據庫就只能通過分布式事務解決了。

常用解決方案有:基于可靠消息(MQ)的解決方案、兩階段事務提交、柔性事務等。

(3)排序、分頁、函數計算問題

在使用 SQL 時 order by, limit 等關鍵字需要特殊處理,一般來說采用分片的思路:

先在每個分片上執行相應的函數,然后將各個分片的結果集進行匯總和再次計算,最終得到結果。

(4)分布式 ID

如果使用 Mysql 數據庫在單庫單表可以使用 id 自增作為主鍵,分庫分表了之后就不行了,會出現id 重復。

常用的分布式 ID 解決方案有:

UUID

基于數據庫自增單獨維護一張 ID表

號段模式

Redis 緩存

雪花算法(Snowflake)

百度uid-generator

美團Leaf

滴滴Tinyid

這些方案后面會寫文章專門介紹,這里不再展開。

(5)多數據源

分庫分表之后可能會面臨從多個數據庫或多個子表中獲取數據,一般的解決思路有:客戶端適配和代理層適配。

業界常用的中間件有:

shardingsphere(前身 sharding-jdbc)

Mycat

總結

如果出現數據庫問題不要著急分庫分表,先看一下使用常規手段是否能夠解決。

分庫分表會給系統帶來巨大的復雜性,不是萬不得已建議不要提前使用。作為系統架構師可以讓系統靈活性和可擴展性強,但是不要過度設計和超前設計。在這一點上,架構師一定要有前瞻性,提前做好預判。大家學會了嗎?

編輯:jq

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • cpu
    cpu
    +關注

    關注

    68

    文章

    10872

    瀏覽量

    211993
  • 數據
    +關注

    關注

    8

    文章

    7067

    瀏覽量

    89107
  • SQL
    SQL
    +關注

    關注

    1

    文章

    766

    瀏覽量

    44159
  • 磁盤
    +關注

    關注

    1

    文章

    379

    瀏覽量

    25211

原文標題:我們為什么要分庫分表?

文章出處:【微信號:gh_6a53af9e8109,微信公眾號:上海磐啟微電子有限公司】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    ADS1118配置為0X8382,使用單電源3.3V供電,為什么會有差不多50mV的誤差?

    你們好,最近在調試ADS1118的過程中,配置為0X8382,使用單電源3.3V供電,在采集過程中,不知道為什么,會有差不多50mV的誤差,采集直流電3.3V,最終只有2.88V,ADS1118
    發表于 12-10 07:16

    采用多個ADS1299用菊花鏈的方式連接,用內部測試信號進行測試,第二個芯片讀取時不知道為什么出現異常?

    你好,我采用多個ADS1299用菊花鏈的方式連接,采用1299內部測試信號進行測試,第一個芯片讀取時數據是對的,第二個芯片讀取時不知道為什么出現異常。
    發表于 11-27 07:52

    為什么OP27的同相輸入端(3管腳)輸入電源電壓的壓?

    在下面這個電路圖中,為什么OP27的同相輸入端(3管腳)輸入電源電壓的壓?在電路設計中如何確定R6和R7的值?
    發表于 11-07 08:24

    OPA1612單端轉差的電路問題,同相放大和反相放大的THD怎么解決

    。 相對G=1情況手冊上G=-1時的THD+N指標確實會差點,但差的并不多。 不知道為啥下面的G=-1的THD會惡化這么多,有啥辦法可以優化反向放大的THD?
    發表于 10-09 08:01

    軟件系統數據庫的分庫設計

    軟件系統數據庫的分庫設計 系統讀寫分離、分庫技術實現采用MyCat中間件,MyCat 是
    的頭像 發表于 08-22 11:39 ?330次閱讀
    軟件系統數據庫的<b class='flag-5'>分庫</b><b class='flag-5'>分</b><b class='flag-5'>表</b>設計

    LDC0851差感應開關數據

    電子發燒友網站提供《LDC0851差感應開關數據.pdf》資料免費下載
    發表于 08-14 11:41 ?0次下載
    LDC0851差<b class='flag-5'>分</b>感應開關數據<b class='flag-5'>表</b>

    分庫后復雜查詢的應對之道:基于DTS實時性ES寬構建技術實踐

    ,通過分庫應對存系統讀寫性能瓶頸和存儲瓶頸;分庫
    的頭像 發表于 06-25 18:30 ?876次閱讀
    <b class='flag-5'>分庫</b><b class='flag-5'>分</b><b class='flag-5'>表</b>后復雜查詢的應對之道:基于DTS實時性ES寬<b class='flag-5'>表</b>構建技術實踐

    如果你填報電子專業,這些問題最好提前知道(附院校排名名單)

    2024年全國高考報名人數達到1342萬人,比去年增加51萬人,報名人數再創歷史新高。據悉,6月25日左右開始,全國各省市將陸續公布高考成績及各批次分數線。分數出來,很快就要開始填報志愿了。如果你
    的頭像 發表于 06-22 08:11 ?297次閱讀
    如果你<b class='flag-5'>要</b>填報電子專業,這些問題最好提前<b class='flag-5'>知道</b>(附院校排名名單)

    三星Galaxy Z Fold6手機GeekBench測試數據曝光,確認搭載高通驍龍芯片

    據報道,三星 Galaxy Z Fold6 手機已于近期在 GeekBench 跑分庫曝光,其 6.3.0 版本的單核分數高達 1964 ,多核分數則達到了 6619
    的頭像 發表于 05-17 15:47 ?569次閱讀

    大神幫忙讓我理解一下該電路的原理?

    ①一級放大電路這里,我覺得信號輸入后衰減到了原來的五之一,不知道為什么這么衰減,然后這個反饋公式不太記得了,希望大佬給我講解一下 ②二級放大電路這個芯片的引腳是怎么用的我都搞不清楚,學藝不精,其
    發表于 04-16 00:51

    放大電路的缺點,你知道幾個?

    影響我們的電路設計,看看這些弊端,你知道幾個?(本文整理自看海的原創視頻課程《運放秘籍》第二部:儀表放大器專項) 圖1 差放大電路 2. 差分放大器弊端一:輸入阻抗低 差分放大器的輸入阻抗非常低,這與它的匹配電阻相關,而且
    的頭像 發表于 03-05 08:40 ?1238次閱讀
    差<b class='flag-5'>分</b>放大電路的缺點,你<b class='flag-5'>知道</b>幾個?

    知道為什么示波器這么貴嗎?

    示波器儀器儀表
    安泰儀器維修
    發布于 :2024年03月04日 14:43:26

    CYW43455帶有7ACL 路的設備有什么作用嗎?

    嗎? (1 個中央連接到 7 個外圍設備,還是 1 個外圍設備到 7 個中央?) 2. 如果它不能組成最多 7 個鏈接,有什么修改的指導鏈接嗎? 什么將僅限于鏈接號? 3。我能知道為什么我在 ble 數據中找不到描述的 AC
    發表于 03-01 09:08

    晶振的輸出波形解析:三種類型要知道

    晶振的輸出波形解析:三種類型要知道? 差晶振是一種常見的電路元件,用于產生高穩定性的方波信號。它采用了一個振蕩電路,包含了一個典型的集成晶體振蕩器和兩個反向耦合的輸出信號。 差
    的頭像 發表于 01-24 13:46 ?1282次閱讀

    為什么直流電正極和負極,而交流電則火線和零線以及頻率?

    為什么直流電正極和負極,而交流電則火線和零線以及頻率? 直流電與交流電在電路中的分配方式是基于它們的物理特性和用途的,它們在電路中的分配方式有著不同的原因和功能。 首先,讓我們來看看直流電
    的頭像 發表于 01-04 14:44 ?4315次閱讀
    主站蜘蛛池模板: 国产午夜精品理论片久久影视| 快播苍井空| 欧美成人免费一区二区三区不卡| 在线 自拍 综合 亚洲 欧美| 久久这里只有精品2| www.久久久| 亚洲AV天堂无码麻豆电影| 久久青草费线频观看国产| 99热热在线精品久久| 色欲av蜜臀av高清| 狠狠色噜噜狠狠狠狠米奇777| 4484在线观看视频| 我的美女奴隶| 萝莉御姐被吸奶| 国产叼嘿久久精品久久| 一级无毛片| 色宅男看片午夜大片免费看| 黑色丝袜美女被网站| WWW污污污抽搐喷潮COM| 亚洲成人日韩| 欧美GAY猛男GAYA片18禁| 国产精品系列在线观看| 18日本人XXXXXX18| 无限资源在线观看8| 老师系列高H文| 国产精品香蕉视频在线| 13一18TV处流血TV| 无限资源在线观看完整版免费下载 | 又长又大又粗又硬3p免费视频| 泡妞高手在都市免费观看| 国产真实夫妇交换视频| yellow高清免费观看日本| 亚洲欧美高清在线| 日本又黄又裸一级大黄裸片| 久久久久激情免费观看 | 国内久经典AAAAA片| OLDMAN老头456 TUBE| 一个人的视频在线观看免费观看| 日韩一区二区天海翼| 蜜柚在线观看免费高清官网视频 | 国产精品人妻午夜福利 |