李亞楠
摘 ?要:在進行大數據處理軟件或WEB站點設計時,數據庫訪問效率是用戶對軟件的基本要求,也是判斷一個軟件是否優良的重要標準。本文將從數據庫設計、連接方式和數據檢索方式三個方面來簡單介紹幾點提高數據庫訪問效率的辦法。
關鍵詞:數據庫;效率;索引;SQL查詢
1、引言
隨著公司產品的發展,測試數據數據量的逐漸增大,數據庫以其數據共享、數據冗余度低、數據獨立性高、數據集中度高和數據一致性及可維護性高的五大優點,已經成為了公司軟件進行大量、復雜數據處理的必選工具。因此,如何提高數據庫訪問效率也就成為了軟件設計時需要重要考慮的問題之一,如處理不當,則會導致軟件運行速度慢、系統卡死等重大問題。
2、數據庫設計
2.1 使用分布式數據庫
分布式數據庫,顧名思義,也就是數據庫中的數據不是存儲在同一場地,而是分布存儲在多個場地。例如,長慶油田的數字化系統即采用了分布式數據庫,由每個站點來管理該站下油井的基礎數據和測試數據,然后通過數據同步技術來將本站所管理數據與廠級中心服務器進行數據同步。這種設計方案的優點是,局部應用的響應速度較快,可擴展性好,易于集成現有的系統。如公司要進行大量、多層次的數字化產品安裝及系統實施,分布式數據庫將是一個很好的數據處理技術方案。
2.2 分類拆分數據量大的表
對于經常使用的數據表,由于其使用頻率很高,要盡量減少表中的記錄數量。例如,在功圖計產軟件中,將油井的計產參數細分為:靜態參數表、動態參數表、原油物性表。這樣既提高了數據庫的訪問效率,又提高了軟件的可維護性。
2.3 應用“三少”原則
1)數據庫中的表越少越好。只有數據庫中表的個數少了,才能說明系統的E-R圖少而精,去掉了重復的、多余的實體,形成了對客觀世界的高度抽象,進行了系統的數據集成;
2)一個表中組合主鍵的字段個數越少越好。因為主鍵的作用,一是建立主鍵索引,二是作為字表的外鍵,所以組合主鍵的字段個數少了,不僅節省了運行時間,而且節省了索引存儲空間。
3)一個表中的字段個數越少越好。只有字段的個數少了,才能說明在系統中不存在數據重復,且很少有數據冗余,更重要的是督促使用者進行“列變行”,這樣就防止了將子表中的字段拉入到主表中去,在主表中留下許 多空余的字段。所謂“列變行”,就是將主表中的一部分內容拉出去,另外單獨建一個子表。
2.4、創建索引
索引就是加快檢索表中數據的方法。數據庫的索引類似于書籍的索引。在書籍中,索引允許用戶不必翻閱完整個書就能迅速地找到所需要的信息。在數據庫中,索引也允許數據庫程序迅速地找到表中的數據,而不必掃描整個數據庫索引具有以下5點優點:
1)創建唯一性索引,保證數據庫表中每一行數據的唯一性
2)大大加快數據的檢索速度,這也是創建索引的最主要的原因
3)加速表和表之間的連接,特別是在實現數據的參考完整性方面特別有意義。
4)在使用分組和排序子句進行數據檢索時,同樣可以顯著減少查詢中分組和排序的時間。
5)通過使用索引,可以在查詢的過程中使用優化隱藏器,提高系統的性能。
為了提高數據庫訪問效率,在創建索引時,一定要遵循以下幾條原則:
1)表的主鍵、外鍵必須有索引;
2)數據量超過300的表應該有索引;
3)經常與其他表進行連接的表,在連接字段上應該建立索引;
4)經常出現在Where子句中的字段,特別是大表的字段,應該建立索引;
5)索引應該建在選擇性高的字段上;
6)索引應該建在小字段上,對于大的文本字段甚至超長字段,不要建索引;
7)復合索引的建立需要進行仔細分析;盡量考慮用單字段索引代替:
A、正確選擇復合索引中的主列字段,一般是選擇性較好的字段;
B、復合索引的幾個字段是否經常同時以AND方式出現在Where子句中?單字段查詢是否極少甚至沒有?如果是,則可以建立復合索引;否則考慮單字段索引;
C、如果復合索引中包含的字段經常單獨出現在Where子句中,則分解為多個單字段索引;
D、如果復合索引所包含的字段超過3個,那么仔細考慮其必要性,考慮減少復合的字段;
E、如果既有單字段索引,又有這幾個字段上的復合索引,一般可以刪除復合索引;
8)頻繁進行數據操作的表,不要建立太多的索引;
9)刪除無用的索引,避免對執行計劃造成負面影響;
10)索引分為聚集索引和非聚集索引,應根據具體所需查詢條件來建立合適類型的索引。
3、數據庫連接方式
傳統的數據庫連接方式,在動態WEB站點運行時,會頻繁的建立和釋放連接,降低數據庫訪問效率,增加系統的負擔,成為了軟件運行效率的瓶頸。而數據庫連接池則是將已經創建好的連接保存在池中,當有請求來時,直接使用已經創建好的連接對數據庫進行訪問。這樣省略了創建連接和銷毀連接的過程,在性能上得到了提高。
數據庫連接池的工作機制為,當服務器啟動時會建立一定數量的池連接,并一直維持不少于此數目的池連接。客戶端程序需要連接時,池驅動程序會返回一個未使用的池連接并將其表記為忙。如果當前沒有空閑連接,池驅動程序就新建一定數量的連接,新建連接的數量有配置參數決定。當使用的池連接調用完成后,池驅動程序將此連接表記為空閑,其他調用就可以使用這個連接。
4、數據檢索方式
數據檢索的優化主要是根本數據庫的設計方案和查詢條件來設計相應的SQL查詢方案,從而減少數據檢索時間,提高現有資源的利用率。優化數據檢索的方法主要有以下幾種:
1)應盡量避免在 where 子句中對字段進行 null 值判斷,否則將導致引擎放棄使用索引而進行全表掃描;
2)應盡量避免在 where 子句中使用!=或<>操作符,否則將引擎放棄使用索引而進行全表掃描;
3)應盡量避免在 where 子句中使用 or 來連接條件,否則將導致引擎放棄使用索引而進行全表掃描;
4)應盡量避免在 where 子句中對字段進行表達式操作,這將導致引擎放棄使用索引而進行全表掃描;
5)任何地方都不要使用 select * from t,用具體的字段列表代替“*”,不要返回用不到的任何字段;
6)在所有的存儲過程和觸發器的開始處設置 SET NOCOUNT ON,在結束時設置 SET NOCOUNT OFF。無需在執行存儲過程和觸發器的每個語句后向客戶端發送 DONE_IN_PROC 消息;
7)盡量避免向客戶端返回大數據量,若數據量過大,應該考慮相應需求是否合理。
參考文獻
[1] ?施瓦茨,扎伊采夫,特卡琴科.高性能MySQL.電子工業出版社,2013