Asp.Net 網站優(yōu)化系列之數據庫優(yōu)化 分字訣 分表(縱向拆分,橫向分區(qū))
更新時間:2010年06月09日 20:25:41 作者:
上篇談了分庫,這一篇我們來分表
1. 縱向分表
縱向分表是指將一個有20列的表根據列拆分成兩個表一個表10列一個表11列,這樣單個表的容量就會減少很多,可以提高查詢的性能,并在一定程度上減少鎖行,鎖表帶來的性能損耗。
縱向分表的原則是什么呢,應該怎樣拆分呢?答案是根據業(yè)務邏輯的需要來拆分,對于一張表如果業(yè)務上分兩次訪問某一張表其中一部分數據,那么就可以根據每次訪問列的不同來做拆分; 另外還可以根據列更新的頻率來拆分,例如某些列每天要更新3次,有些列從創(chuàng)建開始基本上很少更新。
舉例:
假定場景,我有一張用戶表,這張表包含列:
ID, UserName, Password, RealName, Gender, Email, IsEmailValid, Birthday, Country, City, Address, Mobile, Phone, ZipCode, Hometown, OfficePhone, Company, Position, Industry, LatestLoginTime, LatestLoginIP, LoginTimes,OnlineMinutes
假定現在我們的登錄出現了性能問題,用戶登錄經常出現數據庫超時的現象。我們打算用拆表的方法解決這個問題。先看下涉及到登錄的字段有:UserName,Password,LatestLoginTime,LatestLoginIP,LoginTimes;那么我們就可以以此為依據將原表拆分為:UserLogin和UserBase 兩個表,后者包含除了登錄信息的其他列信息;兩張表都要包含主鍵ID。
2. 橫向分區(qū)
橫向分區(qū)是將表從行的角度拆分,例如將創(chuàng)建時間在05年之前的數據放在一個分區(qū)上,將05年到08年之間的數據放到另一個分區(qū)上,以此類推。橫向分區(qū)所根據的列必須在聚集索引上,通常會根據時間,主鍵id等進行劃分。
橫向分區(qū)將數據劃分為不同的區(qū),在根據分區(qū)列條件進行查詢時可以縮小查詢的范圍,從而提高查詢的性能;另外如果數據庫服務器有多個cpu,則可以通過并行操作獲得更好的性能。
到底要根據那個列進行橫向的分區(qū)和查詢有關系,我們在建表的時候需要分析,會根據那個列進行查詢。
舉例:
1. 訂單是一個實效性很強的實體,我們很少查詢幾年前的訂單數據,我們就可以在訂單的創(chuàng)建時間列上創(chuàng)建分區(qū)函數來做分區(qū)。
2. 比如帖子通常情況下只有在首頁推薦的最新的帖子被訪問次數很多,而幾年前的帖子被訪問的幾率較小,這時候我們可以根據帖子的主鍵id來做分區(qū),id小于300w的在一個分區(qū)上,id在300到600w之間的在一個分區(qū)上。
有關分區(qū)的更多信息,請參考高性能網站建設之 MS Sql Server數據庫分區(qū)
有關如何進行分區(qū),請參考Sql Server 分區(qū)演練
縱向分表是指將一個有20列的表根據列拆分成兩個表一個表10列一個表11列,這樣單個表的容量就會減少很多,可以提高查詢的性能,并在一定程度上減少鎖行,鎖表帶來的性能損耗。
縱向分表的原則是什么呢,應該怎樣拆分呢?答案是根據業(yè)務邏輯的需要來拆分,對于一張表如果業(yè)務上分兩次訪問某一張表其中一部分數據,那么就可以根據每次訪問列的不同來做拆分; 另外還可以根據列更新的頻率來拆分,例如某些列每天要更新3次,有些列從創(chuàng)建開始基本上很少更新。
舉例:
假定場景,我有一張用戶表,這張表包含列:
ID, UserName, Password, RealName, Gender, Email, IsEmailValid, Birthday, Country, City, Address, Mobile, Phone, ZipCode, Hometown, OfficePhone, Company, Position, Industry, LatestLoginTime, LatestLoginIP, LoginTimes,OnlineMinutes
假定現在我們的登錄出現了性能問題,用戶登錄經常出現數據庫超時的現象。我們打算用拆表的方法解決這個問題。先看下涉及到登錄的字段有:UserName,Password,LatestLoginTime,LatestLoginIP,LoginTimes;那么我們就可以以此為依據將原表拆分為:UserLogin和UserBase 兩個表,后者包含除了登錄信息的其他列信息;兩張表都要包含主鍵ID。
2. 橫向分區(qū)
橫向分區(qū)是將表從行的角度拆分,例如將創(chuàng)建時間在05年之前的數據放在一個分區(qū)上,將05年到08年之間的數據放到另一個分區(qū)上,以此類推。橫向分區(qū)所根據的列必須在聚集索引上,通常會根據時間,主鍵id等進行劃分。
橫向分區(qū)將數據劃分為不同的區(qū),在根據分區(qū)列條件進行查詢時可以縮小查詢的范圍,從而提高查詢的性能;另外如果數據庫服務器有多個cpu,則可以通過并行操作獲得更好的性能。
到底要根據那個列進行橫向的分區(qū)和查詢有關系,我們在建表的時候需要分析,會根據那個列進行查詢。
舉例:
1. 訂單是一個實效性很強的實體,我們很少查詢幾年前的訂單數據,我們就可以在訂單的創(chuàng)建時間列上創(chuàng)建分區(qū)函數來做分區(qū)。
2. 比如帖子通常情況下只有在首頁推薦的最新的帖子被訪問次數很多,而幾年前的帖子被訪問的幾率較小,這時候我們可以根據帖子的主鍵id來做分區(qū),id小于300w的在一個分區(qū)上,id在300到600w之間的在一個分區(qū)上。
有關分區(qū)的更多信息,請參考高性能網站建設之 MS Sql Server數據庫分區(qū)
有關如何進行分區(qū),請參考Sql Server 分區(qū)演練
相關文章
Visual Studio Debug實戰(zhàn)教程之基礎入門
這篇文章主要給大家介紹了關于Visual Studio Debug實戰(zhàn)教程之基礎入門的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2018-09-09
關于HttpHandler與HttpModule的理解和應用方法
本篇文章小編將為大家介紹,關于HttpHandler與HttpModule的理解和應用方法,有需要的朋友可以參考一下2013-04-04
.NET Core單文件發(fā)布靜態(tài)編譯AOT CoreRT的方法詳解
這篇文章主要給大家介紹了關于.NET Core單文件發(fā)布靜態(tài)編譯AOT CoreRT的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2018-07-07
.NET下通過HttpListener實現簡單的Http服務
這篇文章主要為大家詳細介紹了.NET下通過HttpListener實現簡單Http服務的相關資料,感興趣的小伙伴們可以參考一下2016-09-09
asp.net MaxLengthValidator 最大長度驗證控件代碼
如果數據庫字段為varchar或char類型,ASP.NET控件在可輸入漢字的情況下,MaxLength屬性不能保證在保存到數據庫時不發(fā)生截斷錯誤,因此寫了一個最大長度驗證控件,還可用于多行文本框。2009-12-12
C# 中使用iTextSharp組件創(chuàng)建PDF的簡單方法
C# 中使用iTextSharp組件創(chuàng)建PDF的簡單方法,需要的朋友可以參考一下2013-03-03
Asp.Net Core中服務的生命周期選項區(qū)別與用法詳解
這篇文章主要給大家介紹了關于Asp.Net Core中服務的生命周期選項區(qū)別與用法的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2018-11-11

