天天看點

老大讓我優化資料庫,我上來就分庫分表,他過來就是一jio。。。

記得,如果有人問你做資料庫優化最有效的方式是什麼?

SQL優化、分布式叢集、分庫分表!幹就完了~

但上來就考慮分庫分表真的合适麼,你對分庫分表又了解多少呢?什麼時候分?有幾種分法兒?

首先我們要知道分庫、分表都是幹啥的,本文主角還是我們的MySQL為第一視角。首先從字面意思來看:

分庫:

由單個資料庫執行個體拆分成多個資料庫執行個體,将資料分布到多個資料庫執行個體中。

分表:

由單張表拆分成多張表,将資料劃分到多張表内。

要知道,對于大型網際網路項目,資料量級可能不是我們能想到的,每日新增資料量過千萬是常有的事兒,想靠單台MySQL伺服器是不現實的。你項羽在牛B,也頂不住四個隊友挂機啊!!項羽:???

随着業務資料量和網站QPS日益增高,對資料庫壓力也越來越大,單機版資料庫很快會到達存儲和并發瓶頸,就需要做資料庫性能方面的優化,分庫分表采取的是分而治之的政策,分庫目的是減輕單台MySQL執行個體存儲壓力及可擴充性,而分表是解決單張表資料過大以後查詢的瓶頸問題,坦白說,這些問題也是所有關系型資料庫的“硬傷”。

今天我們就基于常見分庫、分表的政策方式以及場景,來搞清楚我們到底啥時候用的到。常用政策包括:垂直分表、水準分表、垂直分庫、水準分庫。

一、樸實無華的 - 分表

老大讓我優化資料庫,我上來就分庫分表,他過來就是一jio。。。

1、垂直分表

垂直分表,或者叫豎着切表,是不是感受到該政策是以字段為依據的!主要按照字段的活躍性、字段長度,将表中字段拆分到不同的表(主表和擴充表)中。

特點:

每個表的結構都不一樣;

每個表的資料也不一樣,有一個關聯字段,一般是主鍵或外鍵,用于關聯兄弟表資料;

所有兄弟表的并集是該表的全量資料;

場景:

有幾個字段屬于熱點字段,更新頻率很高,要把這些字段單獨切到一張表裡,不然innodb行鎖很惡心的,鎖死你呀,如使用者表裡的餘額字段?不,我的餘額就很穩定,一直是0。。

有大字段,如text,存儲壓力很大,畢竟innodb資料和索引是同一個檔案;同時,我又喜歡用SELECT *,你懂得,這磁盤IO消耗的,跟玩兒似的,誰都扛不住的。

有明顯的業務區分,或表結構設計時字段備援;有些小夥伴看到第一點時,就發現陳哈哈是個菜雞,使用者表怎麼會有餘額字段?明顯有問題啊!趕緊先到評論區噴陳哈哈一波,然後笑嘻嘻的發現原來是個小尾巴,真不要臉是吧。。是的,是以不同業務我們要把具體字段拆開,這樣才有利于業務後續擴充哦。

2、水準分表

水準分表,也叫“橫着切”。。以行資料為依據進行切分,一般按照某列的自容進行切分。

如手機号表,我們可以通過前兩位或前三位進行切分,如131、132、133 → phone_131、phone_132、phone_133,手機号有11位(100億),量大是很正常的事兒,這年頭誰家老頭老太太每個手機呢是吧。這樣切就把一張大表切成了好幾十張小表,資料量不就下來了。

有同學就問了那我怎麼知道我這手機号查哪個表呢?一看你就沒認真看前兩行标紅的點,為啥标紅嘞?比如我查13100001111,那我截取前三位,動态拼接到查詢的表名上,就行了。

每個表的結構都一樣;

每個表的資料都不一樣,沒有交集;

所有表的并集是該表的全量資料;

單表的資料量過大或增長速度很快,已經影響或即将會影響SQL查詢效率,加重了CPU負擔,提前到達瓶頸。記得水準分表越早越好,别問我為什麼。。

二、花裡胡哨的 - 分庫

需要你注意的是,傳統的分庫和我們熟悉的叢集、主從複制可不是一個事兒;多節點叢集是将一個庫複制成N個庫,進而通過讀寫分離實作多個MySQL服務的負載均衡,實際是圍繞一個庫來搞的,這個庫稱為Master主庫。

而分庫就不同了,分庫是将這個主庫一分為N,比如一分為二,然後針對這兩個主庫,再配置2N個從庫節點。

1、垂直分庫

縱向切庫,太經典的切分方式,基于表進行切分,通常是把新的業務子產品或內建公共子產品拆分出去,比如我們最熟悉的單點登入、鑒權子產品。熟悉的味道,記得有一次我把一些沒用的表切到一個性能很好的伺服器中,這伺服器我專門用來學習,後來也不知被哪個狗腿子告密了~

老大讓我優化資料庫,我上來就分庫分表,他過來就是一jio。。。

每個庫的表都不一樣;

表不一樣,資料就更不一樣了~ 沒有任何交集;

每個庫相對獨立,子產品化;

可以抽象出單獨的業務子產品時,可以抽象出公共區時(如字典、公共時間、公共配置等),或者想有一台屬于自己的伺服器時?

2、水準分庫

以行資料為依據,将一個庫中的資料拆分到多個庫中。大型分表體驗一下?坦白說這種政策并不實用,因為會對背景開發很不友好,有很多坑,不建議采用,了解即可。

每個庫的結構都一樣;

每個庫的資料都不一樣,沒有交集;

所有庫的并集是全量資料;

系統絕對并發量上來了,CPU記憶體壓力大。分表難以根本上解決量的問題,并且還沒有明顯的業務歸屬來垂直分庫,主庫磁盤接近飽和。

總結

本文就到這裡,希望你學廢了!其實,在實際工作中,我們在選擇分庫分表政策前,想到的應該是從緩存、讀寫分離、SQL優化等方面,因為這些能夠更直接、代價更小的解決問題。

要記住動表就是動根本,你永遠不知道這張表後面會連帶多少曆史遺留問題,如果是個很大型的項目,遇到些問題你就跟經理提議要分庫分表,小心被呼死~

原文連結:

https://blog.csdn.net/qq_39390545/article/details/116248222

版權聲明:本文為CSDN部落客「_陳哈哈」的原創文章,遵循CC 4.0 BY-SA版權協定,轉載請附上原文出處連結及本聲明。