Asp.Net 網(wǎng)站優(yōu)化系列之?dāng)?shù)據(jù)庫優(yōu)化分字訣上 分庫
更新時間:2010年06月09日 20:23:04 作者:
當(dāng)我們的數(shù)據(jù)量很小的時候,我們會把用戶表,博客表,論壇表,閃存表等等都砸在一個庫里,我們的業(yè)務(wù)增長的很好,在不久之后我們盡力的優(yōu)化了查詢,但是效果依然不佳,這時候用分字訣的時機(jī)到了。
如果你有先見之明的話,會給表名,存儲過程的名字加上前綴,例如論壇表命名為BBS_xxx,博客表命名為BLOG_xxx;這樣的話在分表處理時會比較容易一些。說到這兒也許你會想到外鍵約束怎么辦,我的博客表,論壇帖子表都有用了User表的主鍵做外鍵呀。這個很容易處理,我們需要當(dāng)機(jī)立斷的刪掉外鍵,這個當(dāng)機(jī)立斷可能會帶來一些麻煩,我們來分析下可能會遇到一些什么問題:
1. 分成多個庫,沒了外鍵了以前的inner join操作要跨庫嗎?
假定場景:博客表有對用戶表的外鍵引用,我們需要在首頁顯示博客列表,博客列表需要顯示用戶名和用戶id的信息
之前用戶表,博客表在一個庫里面的時候我們可以通過外鍵inner join來取得用戶的關(guān)聯(lián)信息,現(xiàn)在用戶庫和博客庫被拆成了兩個庫,我想對跨庫做inner join說no;為什么呢,因為這不適合擴(kuò)展,假如有一天我們的業(yè)務(wù)量又增長了我們就需要把用戶庫挪到另外一臺機(jī)器上,這要導(dǎo)致inner join跨服務(wù)器了,這顯然不是一個好辦法,那該怎么辦呢? 我有兩種方案,大家評判好壞:
1)做違反范式的設(shè)計,將用戶的不變信息用戶名和用戶id一起存在博客表中,讓用戶名冗余吧,這樣做可以保證取博客數(shù)據(jù)連帶用戶名時是非常高效率的
2)我們不再從數(shù)據(jù)庫中取用戶名的信息,改從緩存中取,我們可以在緩存中形成一個最近活躍的用戶數(shù)據(jù)池,當(dāng)我們需要用戶名時從這個緩存區(qū)中去取。
目前在我的應(yīng)用中用的是第一種方案,第二種更有伸縮性,第一種存冗余數(shù)據(jù)只能存用戶名,有時候只存用戶名就夠了,有時候可能會出現(xiàn)不夠的問題。
2. 如果用到了根據(jù)外鍵做的級聯(lián)刪除,那這是一個噩夢
對付這個問題,我的方案是修改程序,如果需要級聯(lián)刪除,在程序邏輯中完成,不要在數(shù)據(jù)庫做級聯(lián)刪除了,級聯(lián)刪除是一種隱含在數(shù)據(jù)庫中的邏輯,是一種不好的設(shè)計方案。
3. 觸發(fā)器也可能帶來和外鍵做級聯(lián)刪除同樣的麻煩,同樣的也是修改程序邏輯,代替這種數(shù)據(jù)庫級別的隱含邏輯。
也許你會說分庫之后一定會帶來性能的提高嗎?這個問題得具體分析,這要看你的服務(wù)器性能如何,如果分庫之后數(shù)據(jù)庫的cpu,io,內(nèi)存的壓力依然很大;那么您可以將分庫之后的其中某一個庫遷移到另外一臺服務(wù)器上,讓兩臺服務(wù)器分?jǐn)倲?shù)據(jù)訪問的壓力,肯定會提升性能的。
最后說下,分庫分與不分是由數(shù)據(jù)量、性能要求決定的。下篇分表敬請期待!
1. 分成多個庫,沒了外鍵了以前的inner join操作要跨庫嗎?
假定場景:博客表有對用戶表的外鍵引用,我們需要在首頁顯示博客列表,博客列表需要顯示用戶名和用戶id的信息
之前用戶表,博客表在一個庫里面的時候我們可以通過外鍵inner join來取得用戶的關(guān)聯(lián)信息,現(xiàn)在用戶庫和博客庫被拆成了兩個庫,我想對跨庫做inner join說no;為什么呢,因為這不適合擴(kuò)展,假如有一天我們的業(yè)務(wù)量又增長了我們就需要把用戶庫挪到另外一臺機(jī)器上,這要導(dǎo)致inner join跨服務(wù)器了,這顯然不是一個好辦法,那該怎么辦呢? 我有兩種方案,大家評判好壞:
1)做違反范式的設(shè)計,將用戶的不變信息用戶名和用戶id一起存在博客表中,讓用戶名冗余吧,這樣做可以保證取博客數(shù)據(jù)連帶用戶名時是非常高效率的
2)我們不再從數(shù)據(jù)庫中取用戶名的信息,改從緩存中取,我們可以在緩存中形成一個最近活躍的用戶數(shù)據(jù)池,當(dāng)我們需要用戶名時從這個緩存區(qū)中去取。
目前在我的應(yīng)用中用的是第一種方案,第二種更有伸縮性,第一種存冗余數(shù)據(jù)只能存用戶名,有時候只存用戶名就夠了,有時候可能會出現(xiàn)不夠的問題。
2. 如果用到了根據(jù)外鍵做的級聯(lián)刪除,那這是一個噩夢
對付這個問題,我的方案是修改程序,如果需要級聯(lián)刪除,在程序邏輯中完成,不要在數(shù)據(jù)庫做級聯(lián)刪除了,級聯(lián)刪除是一種隱含在數(shù)據(jù)庫中的邏輯,是一種不好的設(shè)計方案。
3. 觸發(fā)器也可能帶來和外鍵做級聯(lián)刪除同樣的麻煩,同樣的也是修改程序邏輯,代替這種數(shù)據(jù)庫級別的隱含邏輯。
也許你會說分庫之后一定會帶來性能的提高嗎?這個問題得具體分析,這要看你的服務(wù)器性能如何,如果分庫之后數(shù)據(jù)庫的cpu,io,內(nèi)存的壓力依然很大;那么您可以將分庫之后的其中某一個庫遷移到另外一臺服務(wù)器上,讓兩臺服務(wù)器分?jǐn)倲?shù)據(jù)訪問的壓力,肯定會提升性能的。
最后說下,分庫分與不分是由數(shù)據(jù)量、性能要求決定的。下篇分表敬請期待!
您可能感興趣的文章:
- 對于ASP編碼問題的深入研究與最終解決方案
- Asp.Net 網(wǎng)站優(yōu)化系列之?dāng)?shù)據(jù)庫優(yōu)化 分字訣 分表(縱向拆分,橫向分區(qū))
- Asp.Net 網(wǎng)站優(yōu)化系列之?dāng)?shù)據(jù)庫優(yōu)化措施 使用主從庫(全)
- asp.net下數(shù)據(jù)庫操作優(yōu)化一例
- asp.net小談網(wǎng)站性能優(yōu)化
- Asp.net 網(wǎng)站性能優(yōu)化二則分享
- ASP.NET性能優(yōu)化之讓瀏覽器緩存動態(tài)網(wǎng)頁的方法
- ASP.NET性能優(yōu)化之減少請求
- asp.net程序優(yōu)化 盡量減少數(shù)據(jù)庫連接操作
- Asp.Net性能優(yōu)化技巧匯總
- Asp編碼優(yōu)化技巧
相關(guān)文章
詳解最好的.NET開源免費ZIP庫DotNetZip(.NET組件介紹之三)
本篇文章主要介紹了.NET開源免費ZIP庫DotNetZip組件的介紹,可以實現(xiàn)對文件的壓縮和解壓,有興趣的朋友可以了解一下。2016-12-12asp.net UrlReWriter使用經(jīng)驗小結(jié)
UrlRewriter 是微軟封裝好了的一個URL重寫組件。使用它可以讓我節(jié)約很多自已開發(fā)的時間。 好了,開始講述我的應(yīng)用經(jīng)驗,這只是很菜鳥的經(jīng)驗,高手就不用看了。2008-11-11ASP.NET MVC 數(shù)據(jù)驗證及相關(guān)內(nèi)容
這篇文章主要介紹了ASP.NET MVC 數(shù)據(jù)驗證及相關(guān)內(nèi)容的相關(guān)資料,需要的朋友可以參考下2014-10-10.NET Core 3.0 可回收程序集加載上下文的實現(xiàn)
這篇文章主要介紹了.NET Core 3.0 可回收程序集加載上下文的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-06-06DropDownList綁定選擇數(shù)據(jù)報錯提示異常解決方案
DropDownList控件在綁定選擇數(shù)據(jù)時提示報錯異常詳細(xì)信息為:有一個無效 SelectedValue,因為它不在項目列表中,應(yīng)該有很多新手朋友們遇到過吧,本文將給予解決方法,感興趣的朋友可以了解下,希望本對你有所幫助2013-01-01