當mysql中一個表的字段過多,而且數據量過大的時候,為了提高性能,就得考慮對表進行垂直分割了。
所謂的垂直分割,其實就是把一個原先有很多列(字段)的表拆分開來,解決表的寬度問題。
而分割也是講究原則的,更好的分割可以更多的提交性能和效率,那麼我們通常可以按照以下原則進行:
1. 把不常用的字段單獨放一個表中;
2. 最好把大字段獨立放一個表中;
3. 把經常一起使用的字段放到一個表中;
4. 把經常需要參與篩選條件的字段放到主表中。
數據的切分(Sharding)模式
一種是按照不同的表(或者Schema)來切分到不同的數據庫(主機)之上,這種切可以稱之為數據的垂直(縱向)切分;另外一種則是根據表中的數據的邏輯關系,將同一個表中的數據按照某種條件拆分到多台數據庫(主機)上面,這種切分稱之為數據的水平(橫向)切分。
垂直切分:
一個架構設計較好的應用系統,其總體功能肯定是由很多個功能模塊所組成的,而每一個功能模塊所需要的數據對應到數據庫中就是一個或者多個表。而在架構設計中,各個功能模塊相互之間的交互點越統一越少,系統的耦合度就越低,系統各個模塊的維護性以及擴展性也就越好。這樣的系統,實現數據的垂直切分也就越容易。
一般來說,如果是一個負載相對不是很大的系統,而且表關聯又非常的頻繁,那可能數據庫讓步,將幾個相關模塊合並在一起減少應用程序的工作的方案可以減少較多的工作量,這是一個可行的方案。一個垂直拆分的例子:
1.用戶模塊表:user,user_profile,user_group,user_photo_album
2.群組討論表:groups,group_message,group_message_content,top_message
3.相冊相關表:photo,photo_album,photo_album_relation,photo_comment
4.事件信息表:event
群組討論模塊和用戶模塊之間主要存在通過用戶或者是群組關系來進行關聯。一般關聯的時候都會是通過用戶的id或者nick_name以及group的id來進行關聯,通過模塊之間的接口實現不會帶來太多麻煩;
相冊模塊僅僅與用戶模塊存在通過用戶的關聯。這兩個模塊之間的關聯基本就有通過用戶id關聯的內容,簡單清晰,接口明確;
事件模塊與各個模塊可能都有關聯,但是都只關注其各個模塊中對象的ID信息,同樣可以做到很容易分拆。
垂直切分的優點
數據庫的拆分簡單明了,拆分規則明確;
應用程序模塊清晰明確,整合容易;
數據維護方便易行,容易定位;
垂直切分的缺點
部分表關聯無法在數據庫級別完成,需要在程序中完成;
對於訪問極其頻繁且數據量超大的表仍然存在性能瓶頸,不一定能滿足要求;
事務處理相對更為復雜;
切分達到一定程度之後,擴展性會遇到限制;
過讀切分可能會帶來系統過渡復雜而難以維護。