MySQL垂直分庫,水平分庫,垂直分表,水平分表
之前經常被問道這些分庫分表的概念,只是大概知道,但是具體如何定義的,問什么這么定義還是不太理解,今天對著數據表中的數據沉思的時候,突然間醒悟,原來這些概念非常好理解,而且可以說水平和垂直這兩個詞用得恰到好處,非常形象地幫助我們理解它們。
水平分表
顧名思義,水平分表就是把表中的數據進行了水平切割,意味著按照行進行切割,也就是說不同行的數據被切割后可能在不同的表中。

如圖所示,根據水平切割之后,id為1和2的數據行會在一個表中,id為3,4的數據行會在一個表中,而id為5的數據會在一個表中,這就是水平分表。
垂直分表
也是一樣,它的意思是把數據表進行了垂直分割,原來表中的列被分到了不同的表中。

如圖所示,desc字段被切割后,會分配到另一張表中。 那么為什么要垂直分表,或者說什么情況下適合垂直分表? 答案就是垂直分表的目的就是將表中的含有大量數據的字段,比如text字段,blob字段從表中分離出去,這樣可以大大減輕原表的數據壓力,而且這些字段的訪問量沒有其它字段的訪問頻率高,所以這么處理是合適的。
水平分庫
如果你理解了上面的水平分表和垂直分表,那么數據庫的分割你也會很好理解。 顧名思義,水平分庫相當于把數據庫水平切割,原來一個表中的數據可能會分配到不同的數據庫中,這就是水平分庫。

如圖所示,table1,table2,table3,table4中的數據都會被水平切割一刀,這樣一個表中的數據可能就會被分配到不同的數據庫中。
垂直分庫
垂直分庫,就是將數據庫垂直分割,這回一個表中的數據不會被分配到不同數據庫,但是不同表可能會分配到不同的數據庫。

如圖所示,經過垂直分割table1,table2會分到一個數據庫db1,而table3,table4會分配到另一個數據庫db2。
什么時候垂直分庫呢?答案是根據業務邏輯進行分割。比如我們可以把用戶表和用戶相關的表分配到用戶數據庫中,而把商品表和商品相關的數據分配到商品數據庫中。
總結
總之,無論是何種分割,我們的目的都是為了減少數據庫的壓力,然后盡可能減少查詢帶來的復雜性,只要掌握這兩個核心,其實概念都是次要的,原理才是重要的。