在正式開始以前,菜菜仍是要強調一點,你的數據表是否應該分,須要綜合考慮不少因素,好比業務的數據量是否到達了必需要切分的數量級,是否能夠有其餘方案來解決當前問題?我不止一次的見過,有的leader在不考慮綜合狀況下,盲目的進行表拆分業務,致使的狀況就是你們不停的加班,連續幾周996,難道leader你不掉頭髮嗎?還有的架構師在一個小小業務初期就進行表拆分,你們爲了配合你也是快馬加鞭的加班趕進度,上線以後反而發現業務數據量很小,可是代碼上卻被分表策略牽制了太多。拆表引發的問題在特定的場景下,有時候代價真的很大。
數據庫表的拆分解決的問題主要是存儲和性能問題,mysql在單表數據量達到必定量級後,性能會急劇降低,相比較於sqlserver和Oracle這些收費DB來講,mysql在某些方面仍是處於弱勢,可是表的拆分這個策略卻適用於幾乎全部的關係型數據庫。mysql
數據庫進行表拆分不要太盲目算法
表的拆分和數據庫的拆分有類似之處,可是拆分的規則也有不一樣。如下的拆分規則針對的是拆分一個表。sql
橫向切分是諸多業務中最經常使用的切分方式,本質是把一個表中的數據行按照規則分散到多個表中,好比最多見的按照ID範圍,按照業務主鍵的哈希值等。至於表數據到達什麼數量級以後進行切分,這和表中存的數據格式有關,好比一個表只有幾列的int字段確定要比幾列text類型的表存儲的極限要高。姑且認爲這個極限是1000萬吧。可是做爲一個系統的負責人或者架構師來講,當表的數據量級到達千萬級別要引發重視,由於這是一個系統性能瓶頸的隱患。數據庫
相對於數據表的橫向切分,在符合業務優化的場景下我更傾向於作表分區,按照規則把不一樣的分區分配到不一樣的物理磁盤,這樣的話,業務裏的sql語句幾乎能夠不用改動。我司的一個sqlserver數據庫,某個業務的表作了表分區以後,已經到達幾十億級別的數據量,可是查詢和插入速度仍是能知足業務的需求(優化一個系統仍是要花精力優化業務層面)。設計模式
說到垂直拆分,表也能夠按照業務來拆分,好比一個數據庫中有用戶的信息,根據業務能夠劃分爲基礎信息和擴展信息,若是對業務有利,徹底能夠拆分爲基礎信息表和擴展信息表。固然也能夠按照別的規則來拆,好比把訪問頻繁的信息拆分紅一個表,其餘不頻繁的信息拆分紅一個表,具體的拆分規則仍是要看當時要解決的問題是什麼。垂直拆分可能會引入必定複雜性,好比原來查詢一個用戶的基礎信息和擴展信息能夠一次性查詢出結果,分表以後須要進行Join操做或者查詢兩次才能查詢出結果。數據結構
你在業務中進行過表拆分嗎?架構
更多精彩文章併發