提公升資料庫資料查詢效率

2021-07-24 04:24:36 字數 2822 閱讀 1470

1. 前言

隨著資訊科技的發展,資訊系統在企業中的應用也越來越廣泛,資訊系統在企業運營中扮演者十分重要的角色。可以說在資訊化如此廣泛的今天,企業資訊化是提公升企業運營效率的必經之路,資料是企業資產中必不可少的組成部分,資料組織效率的高低可能直接影響企業業務的進展,資料的安全則關係到整個企業的命運與興亡。資料是系統重要的組成部分,資料庫又是承載資料最重要的載體,那麼資料庫在整個資訊系統的地位也是可想而知的。資料庫不僅承擔這整個資訊系統資料的儲存管理,還要保證應用系統能夠與其進行高效的互動。在現實的工作中,我們的資料庫主要還是關係型資料庫,所以在本文我們還是針對關係型資料庫的優化進行討論分析。

2. 資料庫優化

資料庫效能的提公升主要有兩種途徑:硬體層面的提公升與軟體層面的提公升。硬體層面的提公升主要包括資料庫所在伺服器硬體的提公升,如增加cpu核數,提公升cpu主頻,增加記憶體容量等方法,軟體層面的提公升有:資料庫表結構的優化,表中各欄位型別的選擇,sql語句的優化等。從效能提公升成本的角度講,軟體層面的優化成本遠遠小於硬體層面的優化成本,但是從複雜性的角度看,硬體層面的優化要勝過軟體層面的優化,因為採購回來直接部署即可,在人力發明相對花費較少。大部分情況還是採取軟體優化的方式,因為這種方式雖然需要花費額外的人力去進行修改維護,但這種方式還是能夠為企業節省不少資金,在我們的實際工作中也是採用這樣的方法,所以本文只針對從軟體層面優化做進一步的解釋說明。

2.1 sql語句的優化

2.2 表的分隔

因系統初期架構設計的原因,系統會隨著時間的推移當資料量逐漸增多時會逐漸拖低資料庫的效率。很多時候單一乙個資訊系統,由於業務的原因或者其他原因等等,致使資料庫中單張表的資料量要遠遠大於其他表的資料量,而且該錶的資料增長速度也十分高。這樣的表往往是使用者使用最頻繁的表。假設資料庫中的資料隨著時間的增長會無限制地增長下去,這樣無論sql語句設計得多麼高效,那麼最後的查詢效率情況如何肯定是可想而知的。在這樣一種情況下,降低單錶的資料量肯定是首選的解決方法。那麼如何才能降低單錶的資料量呢?一般而言有以下幾種方案:水平分隔,垂直分隔,優化表中的字段。

水平分隔:顧名思義就是將表進行水平條目方向的分隔,分隔可以按照一定規則進行操作,例如,對整個系統資料活躍度的分布調查,如果發現使用者查詢主要集中在某個時間段,那麼可以將這個時間段中的資料放在主查詢的表中,而其他資料則放在從查詢表中,當然如果從查詢表中的資料依然很多,影響查詢效率,那麼可以根據一定規則對從查詢表繼續進行水平分隔,每次查詢優先操作主查詢表,如果得到相應結果,查詢結束,如果沒有查詢到,則從優先順序高的從查詢表中查詢,返回相應結果。

垂直分割則是從表的垂直方向,即欄位方向對資料表進行分隔,不同於水平分隔的規則制定,垂直分隔的原則一般是確定的,當然最終的目的還是將該錶**,將用處不大的字段分離出去。一般而言應該剔除冗餘字段或者不經常用到的字段,將這些欄位移到其他表中。如果這些欄位有需要再用到,則用連線查詢進行拼接,然後繼續查詢,這樣做就相當於恢復了原來的舊表,但是這樣的查詢畢竟還是頻率很低的,所以此時的開銷高對系統整體效能體驗的影響就不是那麼大了。

2.3 表的字段優化

字段型別的合理選取和優化也是資料庫優化十分常見的手段.在表中作為flag功能的字段,根據業務的需求,欄位的取值範圍可能是確定的。欄位有n種值,0表示value1,1表示value2,……,n表示valuen-1,那麼該字段的長度應該設為logn上取整。例如最簡單的情況只有0/1兩種值,那麼該字段的位數設為1即可,以此類推。盡量避免使用text型別,因為text占用空間是,根據業務需求,例如檔名一般控制在n個字元,那麼可以用varchar(n)代替text型別,這樣使得資料字段能夠在最有效的儲存空間下進行工作,如果資料庫資料儲存占用空間不能進行合理的管理,那麼在資料庫載入資料時會對資料庫造成較大的壓力,進而致使資料庫效率下降。

對於欄位的優化,還有一種常見的方法是為常用的表中的常用列新增索引。我們常見的資料庫系統,其索引使用的資料結構多是b-tree或者b+tree。索引的建立是基於某個欄位的使用頻率上的,索引可以避免全表掃瞄。多數查詢可以僅掃瞄少量索引頁及資料頁,而不是遍歷所有資料頁。但是索引建立是占用空間的,如果索引建立太多,無意也會影響資料查詢的效率。

2.4 後台**查詢優化

後台**的優化主要還是集中於快取的設定,比如利用hibernate自帶的快取,也可以利用其它第三方工具,例如memcache是的使用者可以快取當前查詢資料,如果再次查詢,那麼伺服器就不必再去掃瞄一次資料庫表,直接從快取中讀取上次的查詢結果,從使用者的角度看,使用者無需了解這次查詢的資料是**得到的,只要得到結果快就可以。

另外一點是從**整體架構角度去分析,同表分割的問題類似,如果當某一種業務對應的controller全部集中在乙個檔案中的時候,致使**量十分龐大。經過編譯器編譯得到的class檔案或者dll檔案同樣還是很大,所以為了提公升**的執行效率,可以將**進行合理的重構,類似於前面所述對錶進行水平分割和垂直分割的思想,對**也進行同樣的分割,降低整個controller的壓力,從而提公升**的執行速度。

3. 提示硬體的效能

這一點相比較上述幾點就沒啥技術含量了,但是很直接有效,比如增加伺服器cpu核數,更換主頻更高的cpu,增加伺服器記憶體,這都是提示硬體效能的手段,無非就是這些手段成本比較高。

4. 小結

資料查詢效率的高低輕則影響使用者的體驗,重則影響公司業務進行的速度,最嚴重的情況可能給公司帶來經濟上的損失,所以在資訊系統運維上dba(資料庫管理員)一直是乙個十分重要的角色,這個職位不僅要實時監控保證資料庫的正常執行,還要保證資料庫系統高效地執行。為了降低運維成本,在實施後台**設計及資料庫設計的時候就要將各種可能出現的問題都要提前想到,這樣就可以使得系統能夠達到高可用,高效率以及高伸縮。

資料庫查詢提公升查詢效率

在乙個千萬級別的資料庫查詢中,提公升查詢效率方法 對查詢優化,要盡量避免全表掃瞄,首先考慮在where和orderby涉及的列上建索引 應盡量避免在where字句中對null值進行判斷,否則導致引擎放棄索引而進行全表掃瞄,如 select id from t where num is null,可以...

資料庫 資料查詢(三)

1 表示任意的一位字元 2 表示任意位數的任意字元 3 要實現模糊查詢需要使用到關鍵字 like 基本語法 select from 資料 where 模糊查詢字段 like 模糊查詢的關鍵字 注 模糊查詢要在 where 子句中去使用 例 查詢emp表中姓名是以a開頭的雇員資訊 select fro...

MySQL資料庫 資料查詢

高階2 條件查詢 語法 select 查詢列表 from 表名where 篩選條件 分類 一 按條件表示式篩選 條件運算子 二 按邏輯運算子篩選 邏輯運算子 and or not 三 模糊查詢 like between inis null 一 按條件表示式篩選 案例一 查詢工資 12000的員工資訊...