一個功能的實(shí)現(xiàn)簡單,但是一個功能能夠在滿足用戶體驗(yàn)度的情況下實(shí)現(xiàn)就不是都那么容易了。例如在評教系統(tǒng)中,在考試系統(tǒng),在選課系統(tǒng)中,甚至高一點(diǎn)到我們的12306系統(tǒng)中,如何在高用戶量,高并發(fā)的情況下,還能保證高效的運(yùn)行,這次是更難于解決的,需要我們下
一個功能的實(shí)現(xiàn)簡單,但是一個功能能夠在滿足用戶體驗(yàn)度的情況下實(shí)現(xiàn)就不是都那么容易了。例如在評教系統(tǒng)中,在考試系統(tǒng),在選課系統(tǒng)中,甚至高一點(diǎn)到我們的12306系統(tǒng)中,如何在高用戶量,高并發(fā)的情況下,還能保證高效的運(yùn)行,這次是更難于解決的,需要我們下更多功夫所在的地方。
這里從實(shí)際項(xiàng)目開發(fā)中,提取一點(diǎn)經(jīng)驗(yàn),雖然看似小,但是做好了,卻會對效率有很大的不同,這里從數(shù)據(jù)庫的設(shè)計到應(yīng)用兩個方面來提一些作為我們程序員可以改善的地方。
一,設(shè)計:
1,首先就是范式的靈活運(yùn)用,一般情況下三范式是我們設(shè)計數(shù)據(jù)庫所要遵循的原則。但是我們需要根據(jù)實(shí)際情況實(shí)際對待,有時候適當(dāng)?shù)娜哂嘧侄?,減少表之間的連接,反而會大大提高查詢效率。這里不僅僅要考慮各種設(shè)計原則,還需要考慮在真正的使用當(dāng)中,查詢那個表多,操作那個表中的數(shù)據(jù)多等等,通過全方位的考慮,來設(shè)計表的結(jié)構(gòu)。要以最后的效果為指揮棒來進(jìn)行設(shè)計,不要墨守成規(guī)即可。當(dāng)然了這是很難掌握的,需要很多的項(xiàng)目經(jīng)驗(yàn)才能夠達(dá)到我們想要的效果。
2,索引的建立:索引需要建立的適當(dāng),應(yīng)該對常查詢的表中添加索引,而不要一味盲目的使用索引,因?yàn)橐蔷S護(hù)索引的付出小于他的回報,那么就沒有意義,反而更加麻煩了。
3,對表進(jìn)行劃分:這里想提一下水平劃分,垂直劃分和時間軸劃分
水平劃分:就是根據(jù)某個字段將表分成若干個表。例如在學(xué)生管理系統(tǒng)中,可以根據(jù)學(xué)院將學(xué)生信息表劃成更多張,更或者根據(jù)年級再次劃分,這樣相當(dāng)于一個學(xué)院一張表或者一個年級一張表。這里想提的就是對表進(jìn)行劃分的粗細(xì)程度,根據(jù)數(shù)據(jù)量,查詢頻率等進(jìn)行劃分,找到一個最恰當(dāng)?shù)牧6龋€是需要開發(fā)者有很高的水平的。
垂直劃分: 這里其實(shí)就是三范式的靈活運(yùn)用,例如還是學(xué)生信息表,還可以劃分為學(xué)生基礎(chǔ)信息表,和學(xué)生獲獎信息表等,還是根據(jù)查詢使用的字段進(jìn)行劃分,方便我們對數(shù)據(jù)的處理即可。
時間軸劃分:這種情況是針對信息的產(chǎn)生量過大的情況下,例如每天有大量的信息收集,我們可以根據(jù)月,周,天甚至小時進(jìn)行對表劃分。因?yàn)橐恍v史信息我們很少情況下才會用到的,這樣我們保證最新信息的查詢高效更重要。
4,字段的類型選擇要恰當(dāng):這里包括字段的長度,類型等,要根據(jù)實(shí)際存儲的數(shù)據(jù)進(jìn)行選擇,長度不要過長,否則會大大影響效率。
5,外鍵要慎用:因?yàn)橹麈I代表著一張表,而外鍵就代表著一群表,對表與表之間進(jìn)行了關(guān)聯(lián),一表動就會引起另一張表的。有的情況下我們甚至可以不適用外鍵,及時有這種關(guān)系,我們通過sql語句進(jìn)行關(guān)聯(lián)即可。
二,操作數(shù)據(jù)庫:
1,盡量多使用PrepareStatement,少用Statement。因?yàn)镻repareStatement是進(jìn)行預(yù)編譯的,對于同類型的sql語句編譯一次即可。提高了效率。
2,Connection設(shè)置為readOnly,Connetion是對數(shù)據(jù)庫的連接,屬于重量級的,我們只是使用它即可。
3,當(dāng)然了緊跟著就是連接池(Connection pool)的使用,提前準(zhǔn)備好一定數(shù)量的數(shù)據(jù)庫連接,這樣會大大提高我們隊(duì)數(shù)據(jù)庫的訪問速率。這里需要提一下MySql提供的數(shù)據(jù)庫連接池默認(rèn)的為100個connection。Oracle10g默認(rèn)的是150個連接數(shù)。
4,在jdbc中采用批量(batch)處理,可以減少數(shù)據(jù)庫的訪問次數(shù),這樣也會大大提高效率。
5,sql語句的編寫,減少嵌套查詢的使用,減少group和having子句的應(yīng)用。
6,利用視圖(View),采用數(shù)據(jù)庫本身機(jī)制進(jìn)行分頁查詢,提高性能。
……
綜上為數(shù)據(jù)庫方面的優(yōu)化,雖然提到的點(diǎn)都是比較小的,但是都是非常使用的,實(shí)在我們開發(fā)中可以很容易控制的,只要我們多用心,多思考,多聯(lián)系實(shí)際情況,會在數(shù)據(jù)庫效率方面大大提高的。很多需要靠我們經(jīng)驗(yàn)來進(jìn)行處理,所以經(jīng)歷過會收獲很多的……積累……
聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com