一:為什么要分表?
- 如果一個表的每條記錄的內容很大,那么就需要更多的IO操作,如果字段值比較大,而使用頻率相對比較低,可以將大字段移到另一張表中,當查詢不查大字段的時候,這樣就減少了I/O操作
- 如果一個表的數據量很少,那么查詢就很快;如果表的數據量非常非常大,那么查詢就變的比較慢;也就是表的數據量影響這查詢的性能。
- 表中的數據本來就有獨立性,例如分別記錄各個地區的數據或者不同時期的數據,特別是有些數據常用,而另外一些數據不常用。
大表對DDL操作有一定的影響,如創建索引,添加字段 修改表結構需要長時間鎖表,會造成長時間的主從延遲,影響正常的數據操作
當產品運營很多年時數據量就會變的很大,如QQ的用戶表,不知道QQ有多少用戶,而且一個人可能有多個QQ號,如訂單表,比如淘寶的訂單數據有多少,都是驚人的數據量。單表行數超過 500 萬行或者單表容量超過 2GB,才推薦進行分庫分表。
二:分割方式
分表有兩種分割方式,一種垂直分割另一種水平分割。
①:垂直分割
簡單來說垂直拆分是指數據表列的拆分,把一張列比較多的表拆分為多張表。 垂直分割一般用于拆分大字段和訪問頻率低的字段,分離冷熱數據。
垂直分割適用于記錄不是非常多的,但是字段卻很多,這樣占用空間比較大,檢索時需要執行大量的I/O,嚴重降低了性能,這個時候需要把大的自讀那拆分到另一個表中,并且該表與源表時一對一關系。
垂直分割比較常見:
- 例如博客系統中的文章表,比如文章tblarticles(id, titile, summary, content, userid, createtime),因為文章中的內容content字段可能會比較長,如果放在tblarticles中會嚴重影響文章表的查詢速度,所以將內容放到tblarticlesdetail(articleid, content),像文章列表只需要查詢tblarticles中的字段即可,如果想要查詢文章的具體內容就關聯tblarticlesdetail,
- 像我們經??吹降膖blorder表有對應的tblorder_detail, 就是減少order字段的數量,將一些使用頻率相對較低的放在detail詳情表中
垂直拆分的優點: 可以使得行數據變小,在查詢時減少讀取的Block數,減少I/O次數。此外,垂直分區可以簡化表的結構,易于維護。 垂直拆分的缺點: 主鍵會出現冗余,需要管理冗余列,并會引起Join操作,可以通過在應用層進行Join來解決。此外,垂直分區會讓事務變得更加復雜。
②:水平分割
水平拆分是指數據表行的拆分,表的行數超過500萬行或者單表容量超過10GB時,查詢就會變慢,這時可以把一張的表的數據拆成多張表來存放。水平分表盡可能使每張表的數據量相當,比較均勻。舉個例子:我們可以將用戶信息表拆分成多個用戶信息表,這樣就可以避免單一表數據量過大對性能造成影響。
水品拆分可以支持非常大的數據量。需要注意的一點是:分表僅僅是解決了單一表數據過大的問題,但由于表的數據還是在同一臺機器上,其實對于提升MySQL并發能力沒有什么意義,所以水品拆分最好分庫。
水平拆分能夠支持非常大的數據量存儲,應用端改造也少,但分片事務難以解決,跨界點Join性能較差,邏輯復雜。
水平拆分會給應用增加復雜度,它通常在查詢是需要多個表名,查詢所有數據需要union操作。在許多數據庫應用中,這種復雜性會超過它帶來的優點,因為只要索引關鍵字不大,則在索引用于查詢時,表中增加2-3倍數據量,查詢時也就增加讀一個索引層的磁盤次數,所以水平拆分要考慮數據量的增長速度,根據實際情況決定是否需要對表進行水平拆分。
例如:電話賬單就可以分成多個表:最近3個月的賬單數據存在一個表,3個月前的歷史賬單存放到另一種表,超過一年的歷史賬單可以存儲到單獨的存儲介質上,這種拆分是最常用的水平拆分方法。
水平分割標準
水平分割最重要的是找到分割的標準,不同的表應根據業務找出不同的標準
- 用戶表可以根據用戶的手機號段進行分割如user183、user150、user153、user189等,每個號段就是一張表
- 用戶表也可以根據用戶的id進行分割,加入分3張表user0,user1,user2,如果用戶的id%3=0就查詢user0表,如果用戶的id%3=1就查詢user1表
- 對于訂單表可以按照訂單的時間進行分表
三 數據庫分片方案
- 客戶端代理: 分片邏輯在應用端,封裝在jar包中,通過修改或者封裝JDBC層來實現。 當當網的 Sharding-JDBC 、阿里的TDDL是兩種比較常用的實現。
- 中間件代理: 在應用和數據中間加了一個代理層。分片邏輯統一維護在中間件服務中。 我們現在談的 Mycat、360的Atlas、網易的DDB等等都是這種架構的實現。
四:中間表查詢:大表統計
創建一個中間表,中間表的結構和原始表結構一樣,或多字段,將原始表中的部分數據轉移到中間表,然后對中間表進行統計。 中間表復制源表部分數據,并且與源表相隔離,在中間表上做統計查詢不會對在線應用產生負面影響 中間表上可以靈活的添加索引增加臨時用的新字段,從而達到提高統計查詢效率和輔助統計查詢作用。






