標籤:互連網 資料庫設計 oracle 語言編程
假如要開發一個日訪問量百萬層級、甚至千萬層級訪問量的互連網平台,效能和安全是首要考慮的因素。單從效能上講,主要從以下幾個方面考慮:
1) 硬體及網路裝置;
2) 分布式、叢集、讀寫分離、CDN加速等;
3) 使用優秀的開發架構,充分利用緩衝機制;
4) 良好的資料庫設計規劃,包括資料庫叢集,關係型資料庫+非關係型資料庫結合;
5) 高效能的開發語言編程,特別是資料庫部分的編程;
等等。
建設一個中大型互連網平台,是有技術含金量的,拋開硬體、網路環境不說,系統的效能很大程度上取決於系統構建是否合理,系統的設計是否優良,其中資料庫端的設計和開發又是關鍵中的關鍵。
本人一直從事互連網平台的開發,也經常參與公司技術人員面試工作,針對資料庫(oracle)部分我通常會問對方二個問題:
1) 請說明char(10)、varchar2(10)和nvarchar2(10)的區別;
2) 請說出十種以上對效能最佳化有影響的做法。
面試下來的結果往往讓人失望,真正能將這兩個問題回答比較好的鳳毛麟角,這主要是因為即使是有很多工作經驗的開發人員,能有機會接觸大一點的互連網平台的機會並不多,更多的是做一些企業管理系統,幾十個,幾百個使用使用者的平台,現在的伺服器效能完全可以彌補設計上效能缺陷的不足。
為了能向高手們學習,針對oracle的設計及開發領域,本人將十來年互連網項目建設經驗和大家分享,不當之處,請指出,大家相互交流學習。
開篇之前,先簡要回答上面兩個問題。
問題1)char(10)、varchar2(10)、nchar(10)和nvarchar2(10)的區別?
Char類型是定長的,不管你是存3個字母還是9個字母,char(10)都是儲存10個位元組,不夠的部分用空格補充;varchar2(10)類型變長,存3個字母就是佔三個位元組。
錯誤觀點:varchar2類型完全可以替代char,能有效節省資料的儲存空間。
糾正:雖然從儲存空間的角度考慮,varchar2確實比char合理,但系統在處理變長類型時,需要額外的資源開銷,當然這種開銷是非常微小的,可以忽略,但當資料量大,需要處理的資料多時,累積的開銷就不能忽略了。因此,當業務明確欄位長度時,應該明確定義為char類型,如郵遞區號char(6)、性別char(1)[F表示女,M表示男]。
Nvarchar類型是針對不同字元集儲存的位元組數不同而產生的。假如要存放最多10個中文,那麼就應該定義為Nvarchar2(10),而不是varchar2(20),因為在UNICODE下一個中文由2個位元組表示,但編碼為UTF-8時,很可能是3個位元組,導致varchar2(20)無法儲存10個中文。當需要存放中文內容的時候,建議定義為nchar或nvarchar2類型。
問題2)請說出十種以上對效能最佳化有影響的做法。
A)有效定義索引
B)普通表資料對應的資料表空間和索引表對應的資料資料表空間分離
C)資料量大的表做分區表設計
D)資料量大的表,依據業務實際情況分拆為當前表和曆史資料表
E)欄位多的大表依據業務實際情況分拆成多個表
F)合理的欄位設計,如能char(2)的就不要定義為char(4),能number(6)明確定義的就不要定義為number或number(10),要記住1000萬條記錄的表,一個多一個位元組就是多10M
G)合理利用oracle的緩衝區,如將頻繁訪問的基礎資料表資料載入到記憶體中
H)盡量減小事務的粒度
I)合理使用物化視圖
J)必要時可以考慮表的壓縮屬性
待續。。。
本文出自 “知行合一” 部落格,請務必保留此出處http://connieguo.blog.51cto.com/9959230/1617573
如何設計一個日訪問量千萬層級的系統,談oracle的進階設計和開發(1)