標籤:mysql 分庫分表 heap 相關 使用 line idt ges 1.7
分庫分表,顧名思義,就是把原本儲存於一個庫一張表的資料分Block Storage到多個庫多張表上。對於大型互連網應用來說,當一張表的資料量達到百萬、千萬時,資料庫每執行一次查詢所花的時間會變多,並且資料庫面臨著極高的並發訪問。通過分庫分表,使資料均衡地分布到多張表中,可以縮短資料查詢所需要的時間,提高資料庫的吞吐,減輕資料庫壓力。
一、垂直切分將表按照功能模組、關係密切程度劃分出來,部署到不同的庫上。常見的分成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個表中執行。 [參考資料]分庫分表的幾種常見形式以及可能遇到的難唯品會訂單分庫分表的實踐總結以及關鍵步驟
2017-6-5/MySQL分庫分表