1. 程式人生 > >Java技術筆記:數據庫的性能優化

Java技術筆記:數據庫的性能優化

有關 控制 edit caption tin -m 利用 分享 影響

數據庫優化是一個很廣的範圍,涉及到的東西比較多,並且每個特定的數據庫,其具體的優化過程也是不一樣的。

一般情況下,數據庫的優化指的就是查詢性能的優化(雖然嚴格上來說不應該是這樣的),讓數據庫對查詢的響應盡可能的快。僅對數據庫系統本身而言,影響到查詢 性能的因素從理論上來講,包括數據庫參數設置(其實就是通過參數控制數據庫系統的內存,i/o,緩存,備份等一些管理性的東西),索引,分區,sql語 句.數據庫參數設置本身是一個很復雜的東西,分區則主要是針對大數據量的情況下,它分散了數據文件的分布,減少磁盤競爭,使效率得到提升。

數據庫優化:

技術分享圖片

1、 查詢出的數據量過大(可以采用多次查詢,其他的方法降低數據量),盡量采取分頁查詢數據

2、鎖或者死鎖(這也是查詢慢常見的問題,是程序設計的缺陷)

3、返回了不必要的行和列

用OR的字句可以分解成多個查詢,並且通過UNION鏈接多個查詢。它們的速度只與是否使用索引有關,如果查詢需要用到聯合索引,用UNION all執行的效率更高。

4、如果是使用like進行查詢的話,簡單的使用index是不行的,但是全文索引,耗空間。 like ‘a%‘ 使用索引 like ‘%a‘ 不使用索引用 like ‘%a%‘ 查詢時,查詢耗時和字段值總長度成正比,所以不能用CHAR類型,而是VARCHAR。對於字段的值很長的建全文索引。

5、 盡量將數據的處理工作放在服務器上,減少網絡的開銷,如使用存儲過程。存儲過程是編譯、優化過,並且被組織到一個執行規劃裏,且存儲在數據庫中的SQL語句(存儲過程是數據庫服務器端的一段程序),是控制流語言的集合,速度當然快。

6、將需要查詢的結果預先計算好放在表中,查詢的時候再Select。這在SQL7.0以前是最重要的手段。例如計算商品購買小計計算。

7、沒有必要時不要用DISTINCT和ORDER BY,這些動作可以改在客戶端執行。它們增加了額外的開銷。這同UNION和UNION ALL一樣的道理。

8、一次更新多條記錄比分多次更新每次一條快,就是說批處理好

9、用臨時表,盡量用結果集和Table類性的變量來代替它,Table 類型的變量比臨時表好

10、數據庫設計:數據庫內所有表結構均添加索引

調整原因:

近日數據庫壓力很大,經查有些大數據量表的查詢速度很慢,導致數據庫服務器CPU一直持續90%-100%,將這些表添加索引後,CPU很快變正常。

根據查詢條件,建立索引,優化索引、優化訪問方式,限制結果集的數據量。註意填充因子要適當(最好是使用默認值0)。索引應該盡量小,使用字節數小的列建索引好(參照索引的創建),不要對有限的幾個值的字段建單一索引如性別字段

11、 將大數據表做分庫、分區處理:

具體操作如下:

1)、將大數據表與主數據庫分離,單獨新建一個數據庫,然後將這些表做分區;

2)、將數據插入到消息隊列內,後臺利用windows計劃任務執行(5分鐘執行一次)C#控制臺程序將消息隊列內的數據批量(消息隊列內有50000條記錄,一次性插入到數據表內)插入到相應的數據表內;

調整原因:

例如:用戶訪問日誌,每次用戶訪問一個頁面的時候我們之前的操作是直接將數據插入數據庫,這樣做對數據庫的訪問及操作太大,嚴重影響其他數據插入、查詢的效率,利用分庫、分區、消息隊列完成此操作的好處是用戶訪問頁面的時候不直接對數據庫操作,而是在消息隊列內積累一定數量的數據後批量插入數據庫,只執行一次數據庫操作,而且因為數據庫分離的原因,對其他的查詢及插入不會有影響。

Java技術筆記:數據庫的性能優化