問題描述
為什么進(jìn)行分表? 分庫?
一般多少數(shù)據(jù)量開始分表?
什么是數(shù)據(jù)庫垂直拆分和水平拆分
回答
為什么要進(jìn)行分庫
業(yè)務(wù)發(fā)展滑蚯,當(dāng)單個數(shù)據(jù)庫中的表越來越多浪蹂,數(shù)據(jù)量越來越大的時候。數(shù)據(jù)的增刪改查所消耗的資源就會增加告材。由于mysql是無法分布式部署(可能會有人說不是有主從嗎坤次?并不是,詳細(xì)會在其他文章說明)的创葡。==而單臺服務(wù)器的資源浙踢,如CPU绢慢、磁盤灿渴、內(nèi)存、IO等都是有限的胰舆。最終數(shù)據(jù)庫所承載的數(shù)據(jù)量和處理數(shù)據(jù)的能力就會遇到瓶頸==骚露。此時有兩種解決方案:
橫向擴(kuò)展
縱向擴(kuò)展
縱向擴(kuò)展就是增加單臺服務(wù)器的性能,如升級cpu缚窿,內(nèi)存棘幸,磁盤換ssd等,這是最簡單的方案倦零,但是也是最燒錢的误续。
橫向擴(kuò)展就是對數(shù)據(jù)進(jìn)行拆分吨悍,放置到多臺服務(wù)器(相對廉價的服務(wù)器)上。對數(shù)據(jù)進(jìn)行拆分蹋嵌,一般是對數(shù)據(jù)進(jìn)行合理的分庫育瓜,再對分離出來的庫進(jìn)行調(diào)優(yōu)。即將單臺服務(wù)器上的壓力分布到多臺機(jī)器中栽烂。這就是分庫的理由
為什么進(jìn)行分表
當(dāng)MySQL的單表的數(shù)據(jù)達(dá)到一定量級的時候(如一千萬)的時候躏仇,就需要考慮進(jìn)行分表。因?yàn)榇藭r的MySQL的執(zhí)行性能就會下降(這和mysql本身的實(shí)現(xiàn)機(jī)制有關(guān))腺办。簡單來講有如下兩個原因
- 鎖機(jī)制
為了保證數(shù)據(jù)的完整性焰手,數(shù)據(jù)庫有鎖定機(jī)制。MySQL中有表鎖定和行鎖定怀喉,MySQL中myisam存儲引擎是表鎖定书妻,innodb存儲引擎是行鎖定。分為包含共享鎖和獨(dú)占鎖兩種磺送。獨(dú)占鎖就是整個數(shù)據(jù)文件歸一個線程所有驻子,其他線程就必須等待。==如果數(shù)據(jù)太多估灿,一次執(zhí)行的時間太長==崇呵,特別是在鎖表的情況下,就會導(dǎo)致大量的其他SQL等待執(zhí)行馅袁,嚴(yán)重影響系統(tǒng)的正常使用域慷。
- 索引更新
更新表數(shù)據(jù)時會導(dǎo)致索引更新,當(dāng)單表數(shù)據(jù)量很大時這個過程比較耗時汗销,這就是為什么對大表進(jìn)行新增操作會比較慢的原因犹褒。并且更新表數(shù)據(jù)會進(jìn)行表級鎖或者行鎖,這樣就導(dǎo)致其他操作等待弛针。
所以我們將大表拆分為多個字表叠骑,那么在更新或者查詢數(shù)據(jù)的時候,壓力會分散到不同的表上削茁。由于分表之后每個表的數(shù)據(jù)較小宙枷,不管是查詢還是更新都極大的提高了速度,即使出現(xiàn)最壞的“鎖表”的情況茧跋,那其他表還是可以并行使用慰丛。
一般多少數(shù)據(jù)量開始分表
這個問題沒有一個固定的答案,需要根據(jù)表的用途和業(yè)務(wù)來要求來評估此數(shù)據(jù)量瘾杭。但是诅病,當(dāng)mysql的數(shù)據(jù)量達(dá)到千萬級別的時候,就需要考慮是否需要進(jìn)行分表操作。以下幾個是一些參考因素:
寫入量(高峰期寫入量贤笆,是否會造成鎖表導(dǎo)致讀或者寫出現(xiàn)一些問題蝇棉,insert,update芥永,delete的比例各多少)
查詢量(查詢量多大银萍,是否跟寫會造成相互影響)
查詢方式(單記錄查詢,還是多記錄查詢恤左,是否有count查詢贴唇,比重各占多少,每次返回的記錄數(shù)數(shù)量級1飞袋,10戳气,100,1000 巧鸭。瓶您。。)
是否有分頁(重點(diǎn)關(guān)注纲仍,是否存在大分頁)
1呀袱,2 算是比較基礎(chǔ)的,正常1kw以下都沒太大問題郑叠。3夜赵,4 受單表數(shù)據(jù)量的影響起始更小,但是反過來乡革,這個就直接影響到 1寇僧,2
不同的情形,數(shù)據(jù)量的規(guī)模不太一樣沸版。例如嘁傀,單表只有insert和單條查詢的,每天增長百萬數(shù)據(jù)视粮,這種億的規(guī)模問題都不大细办,當(dāng)然能拆最好~
有簡單 in 查詢的,這種也能夠接受~ 但是如果有比較大的查詢蕾殴,或者比較復(fù)雜的笑撞,包括大分頁,然后還有大量的 update的区宇,這種表就不能太大娃殖,正常不要超過 300w~
==update 的頻率值戳,應(yīng)該算是里面影響比較大的因素==议谷,insert一般只添加數(shù)據(jù),不會對查詢造成太多影響但是update和 select 可能就會有比較大的相互影響了~
什么是垂直拆分和水平拆分
垂直拆分是指數(shù)據(jù)表列的拆分堕虹,把一張列比較多的表拆分為多張表 或者 將表按模塊劃分到不同數(shù)據(jù)庫表中(分庫或者拆表)
水平拆分是指數(shù)據(jù)表行的拆分卧晓,比如表的行數(shù)超過200萬行時芬首,就會變慢,這時可以把一張的表的數(shù)據(jù)拆成多張表來存放==(分表)==逼裆。