你們?nèi)绾卧O(shè)計(jì)數(shù)據(jù)庫(kù)的評(píng)論?
首先謝謝邀請(qǐng)!我以前弄過(guò)論壇的數(shù)據(jù)庫(kù),分享給您,希望能有些幫助!
簡(jiǎn)單總結(jié)如下:
一 分割思想:
1 數(shù)據(jù)庫(kù)切分:用戶(hù)庫(kù)、主題庫(kù)、回復(fù)庫(kù)
2 數(shù)據(jù)表水平切分:用戶(hù)庫(kù)1-n、主題庫(kù)1-n、回復(fù)庫(kù)1-n (比如按時(shí)間分)
3 分布式數(shù)據(jù)庫(kù):每臺(tái)計(jì)算機(jī)中都有DBMS的一份完整拷貝副本,并具有自己局部的數(shù)據(jù)庫(kù),位于不同地點(diǎn)的許多計(jì)算機(jī)通過(guò)網(wǎng)絡(luò)互相連接,共同組成一個(gè)完整的、全局的大型數(shù)據(jù)庫(kù)。
4 論壇功能可以進(jìn)行分隔,不同的服務(wù)器負(fù)責(zé)不同的功能
5 用主從數(shù)據(jù)庫(kù),master是寫(xiě), slave是讀
6 把內(nèi)容與其它信息分開(kāi),好處就是可以讓每個(gè)表的文件最小化,對(duì)數(shù)據(jù)庫(kù)操作壓力會(huì)減小,這樣保證每張表數(shù)據(jù)量很小,操作速度會(huì)快,也可以在這里使用緩存
二 索引:
針對(duì)是否建立索引有著一定的分歧:
我覺(jué)得建立索引還是很有必要的。理由如下:
1)建立索引可以加快檢索速度,對(duì)于論壇讀和寫(xiě)的比例相差很大,用戶(hù)體驗(yàn)當(dāng)然是讀多寫(xiě)少,所以綜合考慮還是要用索引,而且是加在常用的讀關(guān)鍵字上。
2)索引之所以會(huì)降低更新的速度,是因?yàn)楦逻€包括對(duì)索引的更新,從更新帖子10萬(wàn)左右,這句話(huà)是說(shuō),我們可能對(duì)發(fā)帖標(biāo)題,發(fā)帖內(nèi)容,回復(fù)標(biāo)題,回復(fù)內(nèi)容這4個(gè)字段做更新。需要注意的是,這四個(gè)字段并不是用來(lái)建立表連接的字段,為了優(yōu)化查詢(xún)速度我們不會(huì)在這四個(gè)字段上建立索引,所以從這道題目出發(fā),我們建立的索引不會(huì)影響更新帖子的性能。只要被索引的列(例如回復(fù)表的標(biāo)題ID)不被頻繁更新,即使索引所在地行的其它列被頻繁update,索引也不會(huì)被更新從而產(chǎn)生性能消耗,一張表一天30萬(wàn)次的索引更新,因它引起的性能消耗小到即使數(shù)據(jù)庫(kù)安裝在奔騰3單核CPU下都能輕松承擔(dān)下來(lái)。
3)對(duì)于更新的速度慢的問(wèn)題,我們有解決的方法,你提交更新了后,前臺(tái)可以讓程序返回一個(gè)正確結(jié)果,后臺(tái)開(kāi)個(gè)線(xiàn)程異步慢慢跟新數(shù)據(jù)庫(kù)就是了,反正更新成功的前提就是假設(shè)數(shù)據(jù)庫(kù)連接永遠(yuǎn)正確并處于可靠狀態(tài)。在數(shù)據(jù)庫(kù)和用戶(hù)之間建立一個(gè)緩沖區(qū)。(如,將更新的數(shù)據(jù)放到內(nèi)存中,達(dá)到一定數(shù)量的時(shí)候再統(tǒng)一更新數(shù)據(jù)庫(kù)。假如以100條為例,一旦內(nèi)存中達(dá)到100條數(shù)據(jù)量將這100條數(shù)據(jù)統(tǒng)一入庫(kù)。減少insert操作)
三 緩沖:
讀的時(shí)候的緩沖:緩存路由表
主題緩存表(這個(gè)取每個(gè)區(qū)的前面100條記錄),一般來(lái)說(shuō)負(fù)載最大的就是主題的第一頁(yè),所以緩存表是個(gè)小表。
另外使用hibernate,在數(shù)據(jù)庫(kù)上面加了一層緩存。
生成靜態(tài)頁(yè),緩存最熱,最新的帖子。
對(duì)于經(jīng)常更新的數(shù)據(jù)都設(shè)計(jì)成單獨(dú)表 ,這樣可以最大程度的利用hibernate緩存
緩存常用的數(shù)據(jù)和表,利用緩存來(lái)將經(jīng)常被訪(fǎng)問(wèn)的帖子留在內(nèi)存中,為每條緩存的記錄添加一個(gè)訪(fǎng)問(wèn)時(shí)間,如果長(zhǎng)時(shí)間沒(méi)被訪(fǎng)問(wèn)就從緩存中刪除掉,
避免內(nèi)存過(guò)大,每次用戶(hù)看帖的時(shí)候,首先檢索緩存中時(shí)候有需要的帖子,沒(méi)有的話(huà)再訪(fǎng)問(wèn)數(shù)據(jù)庫(kù),然后將數(shù)據(jù)庫(kù)返回的帖子信息存儲(chǔ)到緩存中。
寫(xiě)的時(shí)候的緩沖:數(shù)據(jù)庫(kù)和用戶(hù)之間建立緩存,將更新的數(shù)據(jù)放在內(nèi)存中,異步操作的。所有的寫(xiě)貼操作 放到一個(gè)隊(duì)列然后批量執(zhí)行插入數(shù)據(jù)庫(kù)操作。
預(yù)估計(jì)的緩沖:假如用戶(hù)第一次打開(kāi)某標(biāo)題,那將此標(biāo)題的相關(guān)的前100條數(shù)據(jù)緩存到客戶(hù)斷。這樣避開(kāi)對(duì)數(shù)據(jù)庫(kù)的直接查詢(xún),減少數(shù)據(jù)庫(kù)壓力。
四 代碼優(yōu)化
1盡量避免表的連接約束通過(guò)代碼來(lái)實(shí)現(xiàn)約束 例如用戶(hù)id的驗(yàn)證在用戶(hù)登錄時(shí)驗(yàn)證這樣就可以把帖子表的用戶(hù)id外鍵去掉這樣就成了單表操作、查詢(xún) 而連接可以通過(guò)觸發(fā)來(lái)實(shí)現(xiàn)這樣最多是查詢(xún)了3個(gè)表而不是連接中的笛卡爾笛卡爾積 回復(fù)表的查詢(xún)限定每次查詢(xún)的記錄數(shù)例如限定10條其它的通過(guò)點(diǎn)擊觸發(fā)來(lái)操作"注代碼優(yōu)化容易出現(xiàn)bug 原因有些開(kāi)發(fā)工具本身有優(yōu)化"
五 數(shù)據(jù)庫(kù)性能調(diào)優(yōu)
盡量用硬件來(lái)代替軟件優(yōu)化 原則就是能用硬件的盡量用硬件 比如磁盤(pán)陣列 RAID0 有條件用RAID10 加大內(nèi)存 .避免小表上建索引 對(duì)論壇來(lái)說(shuō)數(shù)據(jù)帖子和回復(fù)不是很重要 可以定期刪除一些垃圾帖子 樓主說(shuō)的幾百萬(wàn)條記錄的論壇對(duì)現(xiàn)在的數(shù)據(jù)庫(kù)管理系統(tǒng)和計(jì)算機(jī)來(lái)說(shuō)永不著刻意的優(yōu)化,定期維護(hù)打包備份數(shù)據(jù)庫(kù)就可以了
提高速度的關(guān)鍵:
1.建立合理的索引并在查詢(xún)時(shí)充分利用;
2.避免使用關(guān)聯(lián),這樣避免整表掃描;使用關(guān)聯(lián)不如多次使用主鍵查詢(xún)來(lái)的快;
3.一些處理的功能盡可能放到內(nèi)存中來(lái)做,比如組織主題和回復(fù);
4.海量緩存(使用靜態(tài)頁(yè)面也是個(gè)不錯(cuò)的做法)
5 定期對(duì)表進(jìn)行轉(zhuǎn)儲(chǔ)