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