總結關聯式資料庫的效能容易成為系統效能的瓶頸,讀寫分離分散了資料庫的讀寫壓力,但並沒有分散儲存壓力,當資料量達到千萬甚至上億時
當資料庫併發量很大、儲存的資料量很大時,往往需要分庫分表,分擔單個資料庫的儲存壓力、讀寫壓力,提高資料庫效能。
有2種切分策略:水平切分、垂直(縱向)切分。
垂直分庫
根據資料表的耦合度進行拆分,將同一資料庫中關聯度低的表拆分出來,放在新的資料庫中。
垂直分表
①如果某張表的字段很多,可以把不常用的字段拆分出來,單獨放到一張新錶中,實現冷熱資料分離。
②或者把內容較多、較大的字段拆分出來。資料庫底層通過資料頁儲存資料,一條記錄占用空間很大會導致跨頁,拉低效能。
在字段很多的情況下,通過大表拆小表,方便開發、維護,也能避免跨頁問題。
另外,資料庫以行為單位將資料載入到記憶體,表中字段內容越短,能載入到記憶體的資料(記錄數)越多。冷熱分離後,熱點表中熱點欄位多、訪問頻率高,快取命中率也就很高,大大提高了資料庫的檢索效能。
垂直切分的缺點
總之,垂直切分提公升了單錶查詢的效能,但增加了多表關聯查詢的次數。
垂直切分只是減少了單錶的字段數,但並沒有減少單錶的記錄數。水平切分是將單錶中的記錄拆分到多張表中。
按新表存放位置可分為2種
庫內分表只解決了單錶記錄數過多的問題,但拆分出來的表競爭同乙個機器的cpu、記憶體、網路io,並沒有減輕資料庫的儲存壓力。
分庫分表解決了單錶記錄數過多的問題,也分散了單個資料庫的儲存壓力,但垮庫操作要使用分布式事務,事務難度加大,跨庫的多表關聯查詢效能較差。
水平切分都有的缺點:聚合函式、order by排序、group by分組使用不方便,要從多個子表中查資料,然後自己彙總。
2種記錄拆分方式
1、根據範圍進行拆分
eg. 根據id欄位的範圍進行劃分,1 ~ 9999999放到一張表中,10000000~199999999放到一張表中,以此類推。
關鍵在於範圍的選取上,分段太小會導致子表數量過多,增加維護難度;分段太大則拆分意義不大。通常,單個分段大小在100w ~ 2000w之間。優點
2、根據hash值進行拆分
eg. 商品資訊表,計算type欄位的hash值,把hash值相同的字段劃到同一表中,一張子表儲存同一型別的商品。
路由表水平切分,隨著記錄數的增加,子表數量會增加(變化),不能在**中寫死子表名。新建一張表作為路由表,一列儲存子表名,
運算元據庫時,先查路由表得到記錄所在子表,再去操作子表。要多查一次,降低了效能,所以除非單錶記錄數特別多,否則不要輕易水平分表。
就算要水平分表,子表數量也不宜太多,一方面難以維護,另一方面子表太多會導致路由表中記錄數很多,查路由表時間開銷大。
分庫分表,效能有提公升之處,也有降低之處。分庫分表的主要作用是減輕單機資料庫的儲存壓力,效能考慮還再其次。
切分原則:先做垂直切分、再做水平切分。
比如user表,垂直切分為2張表
2張表中都有user_id欄位,用於唯一標識記錄。
此時還可能存在單錶行數過多的問題,需要水平切分。
預估要分散到幾個庫中,每個庫又要分散到幾個表中,對user_id取模,將模值相同的記錄劃分到同乙個庫中,再對同乙個庫中的user_id取模,將模值相同的記錄劃分到同乙個表中。
假設使用者量1億,每個庫2500w個使用者記錄,需要分4個庫;每張表500w條記錄,每個庫又分為5個表。user_id % 4得到該條記錄所在的庫,user_id % 5得到該條記錄所在的表。
分庫分表造成的問題|要考慮的點
分庫分表帶來的問題很複雜,不到萬不得已,不要輕易分庫分表。
分庫分表Mycat總結
在日常的工作中,關係型資料庫本身比較容易成為系統的瓶頸點,雖然讀寫分離能分散資料庫的讀寫壓力,但並沒有分散儲存壓力,當資料量達到千萬甚至上億時,單台資料庫伺服器的儲存能力會成為系統的瓶頸,主要體現在以下幾個方面 資料量太大,讀寫的效能會下降,即使有索引,索引也會變得很大,效能同樣會降下。資料庫檔案會...
mysql分表分庫實現 MySql分表分庫思路
一.資料庫瓶頸 1.1io瓶頸 第一種 磁碟讀io瓶頸,熱點資料太多,資料庫快取放不下,每次查詢時會產生大量的io 分庫和垂直分表 第二種 網路io瓶頸,請求的資料太多,網路頻寬不夠 分庫 1.2cpu瓶頸 第一種 sql問題,如sql中包含join,group by,order by,非索引字段條...
MySQL範圍分表分庫 mysql 分表分庫策略
唯一id的生成 下面列舉幾種常見的唯一id生成方案,需要滿足兩大核心需求 1.全域性唯一 2趨勢有序 1.用資料庫的auto increment 自增id 來生成,每次通過寫入資料庫一條記錄,利用資料庫id自增的特性獲取唯一,有序的id。優點 使用資料庫原有的功能,相對簡單 能夠保證唯一 能夠保證遞...