MySQL分庫分表

2022-03-18 01:24:58 字數 2058 閱讀 8669

分庫分表,顧名思義,就是把原本儲存於乙個庫一張表的資料分塊儲存到多個庫多張表上。對於大型網際網路應用來說,當一張表的資料量達到百萬、千萬時,資料庫每執行一次查詢所花的時間會變多,並且資料庫面臨著極高的併發訪問。通過分庫分表,使資料均衡地分布到多張表中,可以縮短資料查詢所需要的時間,提高資料庫的吞吐,減輕資料庫壓力。

一、垂直切分

將表按照功能模組、關係密切程度劃分出來,部署到不同的庫上。常見的分成6大庫:

1)使用者類庫:用於儲存了使用者的相關資訊。例如:db_user,db_system,db_company等。

2)業務類庫:用於儲存主要業務的資訊。比如主要業務是訂單,用這個庫儲存訂單業務。例如:db_order等。

3)記憶體類庫:主要用mysql的記憶體引擎。前台的資料從記憶體庫中查詢,速度快。例如:heap。

4)類庫:主要儲存的索引以及關聯。例如:db_img_index,db_img_res。

5)日誌類庫:記錄點選,重新整理,登入等日誌資訊。例如:db_log_click,db_log_fresh,db_log_login。

6)統計類庫:對業務的統計,比如點選量,重新整理量等等。例如db_stat。

1、垂直分表

垂直分表,通俗的說法叫做「大表拆小表」,基於關係型資料庫中的「列」(字段)進行拆分。

通常情況,某個表中的字段比較多,可以新建立一張「擴充套件表」,將不經常使用或者長度較大的字段拆分出去放到「擴充套件表」中,每個表裡面的資料記錄數一般情況下是相同的,只是欄位不一樣。

2、垂直分庫

垂直分庫就是依據業務功能的不同,劃分為不同的業務庫。

比如:乙個資料庫裡面既存在使用者資料,又存在訂單資料,還有產品資料,那麼垂直拆分可以把使用者資料放到使用者庫、把訂單資料放到訂單庫、把產品資料放到產品庫。

二、水平拆分

當乙個表中的資料量過大時,可以把該錶的資料按照某種規則,例如userid雜湊,進行劃分,然後儲存到多個結構相同的表和不同的庫上。

1、水平分表

水平分表也稱為橫向分表,就是將表中不同的資料行按照一定規律分布到不同的資料庫表中(仍在同乙個資料庫中),這樣來降低單錶資料量,優化查詢效能。

比如:有一張使用者表user,由於記錄條數太多,將其拆分成256張表,拆分的記錄根據user_id%256取得對應的表進行儲存,比如user_id為10001,10001%256=17,則user_id為10001的資料存在表user17中。

2、水平分庫

與分表策略相似,分庫也可以採用通過乙個關鍵字段取模的方式,來對資料訪問進行路由。

三、垂直水平拆分

垂直水平拆分,是綜合了垂直和水平拆分方式的一種混合方式,垂直拆分把不同型別的資料儲存到不同庫中,再結合水平拆分,使單錶資料量保持在合理範圍內,擴充套件系統的併發處理能力,提公升單錶的查詢效能。

一種分庫分表的路由策略如下(假設採用user_id作為路由字段):

中間變數=user_id% (庫數量x每個庫的表數量)

庫=取整(中間變數/每個庫的表數量)

表=中間變數%每個庫的表數量

假設將原來的單庫單錶order拆分成256個庫,每個庫包含1024個表,那麼按照前面所提到的路由策略,對於user_id=262145的訪問,路由的計算過程如下:

• 中間變數=262145% (256x1024) =1;

• 庫=取整(1/1024) =0;

• 表=1%1024=1。

這意味著,對於user_id=262145的訂單記錄的查詢和修改,將被路由到第0個庫的第1個表中執行。

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。優點 使用資料庫原有的功能,相對簡單 能夠保證唯一 能夠保證遞...

mysql 分庫分表實戰 MySQL分庫分表實戰

為什麼要分庫分表 在大型 中,當使用者量以及使用者產生的業務資料量達到單庫單錶效能極限時,為了支撐業務可持續發展,對於重要的核心業務必然要進行分庫分表來儲存業務資料。對於非核心業務產生的大量資料,例如爬蟲爬取的資訊,論壇產生的資料等,可以考慮把資料儲存在像mongodb這樣的nosql儲存裡面,這些...