MySQL性能優化(四):分表

爲什麼要分表

  • 如果一個表的每條記錄的內容很大,那麼就需要更多的IO操作,如果字段值比較大,而使用頻率相對比較低,可以將大字段移到另一張表中,當查詢不查大字段的時候,這樣就減少了I/O操作

  • 如果一個表的數據量很少,那麼查詢就很快;如果表的數據量非常非常大,那麼查詢就變的比較慢;也就是表的數據量影響着查詢的性能。

  • 表中的數據本來就有獨立性,例如分別記錄各個地區的數據或者不同時期的數據,特別是有些數據常用,而另外一些數據不常用。

  • 大表對DDL操作有一定的影響,如創建索引,添加字段

  • 修改表結構需要長時間鎖表,會造成長時間的主從延遲,影響正常的數據操作

當產品運營很多年時數據量就會變的很大,如QQ的用戶表,不知道QQ有多少用戶,而且一個人可能有多個QQ號,如訂單表,比如淘寶的訂單數據有多少,都是驚人的數據量。單錶行數超過 500 萬行或者單表容量超過 2GB,才推薦進行分庫分表。

 

分割方式

分表有兩種分割方式,一種垂直分割另一種水平分割。

垂直分割

簡單來說垂直拆分是指數據表列的拆分,把一張列比較多的表拆分爲多張表。垂直分割一般用於拆分大字段和訪問頻率低的字段,分離冷熱數據。

垂直分割適用於記錄不是非常多的,但是字段卻很多,這樣佔用空間比較大,檢索時需要執行大量的I/O,嚴重降低了性能,這個時候需要把大的自讀那拆分到另一個表中,並且該表與源表是一對一關係。

垂直分割比較常見:

  • 例如博客系統中的文章表,比如文章tbl_articles(id, titile, summary, content, user_id, create_time),因爲文章中的內容content字段可能會比較長,如果放在tbl_articles中會嚴重影響文章表的查詢速度,所以將內容放到tbl_articles_detail(article_id, content),像文章列表只需要查詢tbl_articles中的字段即可,如果想要查詢文章的具體內容就關聯tbl_articles_detail,

  • 像我們經常看到的tbl_order表有對應的tbl_order_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等等都是這種架構的實現。

中間表查詢 大表統計

  • 創建一箇中間表,中間表的結構和原始表結構一樣,或多字段,將原始表中的部分數據轉移到中間表,然後對中間表進行統計。

  • 中間表複製源表部分數據,並且與源表相隔離,在中間表上做統計查詢不會對在線應用產生負面影響

  • 中間表上可以靈活的添加索引增加臨時用的新字段,從而達到提高統計查詢效率和輔助統計查詢作用。


原文鏈接:https://mp.weixin.qq.com/s/LOY4Wo1ueGAij4CgMuxebw 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章