資料庫查詢效能調優和索引優化

2021-08-26 03:13:50 字數 2112 閱讀 4006

查詢效能調優是個很大的話題,這裡邊涉及到的技術非常廣泛,但是我們一般可以把它大致分為以下幾個層次:

1.減少資料訪問。相關的技術就是建立合適的索引,將全表掃瞄、索引掃瞄(scan)等耗時的操作轉化為索引查詢(seek)。建立正確的索引,能讓資料庫查詢效能提公升100-1000倍甚至更高,就好比一本非常厚的詞典,如果沒有任何索引,你要查乙個東西,那可是相當費盡,需要整本書查一遍,有索引就可以直接根據索引定位了。這是最重要的改善效能的途徑。

2.減少返回的資料。在網路中傳輸資料,頻寬是有限的,如果能按需提取最少量的資料,會起到不錯的作用。這裡需要注意的是,在sql中,不要出現select *,而是需要什麼字段,就提取什麼字段。

3.減少與資料庫互動次數。網路資源有限,顯然,頻繁與資料庫互動,也是制約效能的乙個因素。乙個良好的建議就是,使用儲存過程,或者批處理語句,這樣能減少與資料庫的互動,提公升一部分效能。

4.減少cpu的負荷。這裡,主要是使用快取計畫。在查詢中,盡量使用引數化的查詢。這樣的話,資料庫會對查詢引數進行快取,從而復用查詢計畫。

5.提公升硬體效能。這是最後一招了,如果其他方面都已經做得非常不錯了,效能瓶頸在cpu,記憶體和磁碟上,那採取提公升硬體效能的方案就會顯得比較合適了,否則還是先去優化其他的地方吧。

以上5個層次的優化帶來的效能改善,是依次下降的,是乙個倒置的金字塔。

下邊詳細討論一下索引的那些事。

索引,分為聚集索引(clustered index)和非聚集索引(nonclustered index)兩種。

a.聚集索引

含有聚集索引的表,叫做聚集表,它的資料行的組織方式,是跟聚集索引的順序是一致的。聚集索引覆蓋的列,叫做聚集鍵。

用新華字典來比喻的話,正文的每乙個字就是乙個資料行,他們的組織順序是根據拼音,如果拼音相同,就會根據筆畫(不一定準確,見諒),因此,新華字典裡的聚集索引覆蓋的列就是拼音和筆畫。

很容易理解的是,正文只能按照一種既定的順序去排序,同理,在一張表裡,只能有乙個聚集索引,從而決定著資料行的組織方式。

b.非聚集索引

非聚集索引,用新華字典來比喻的話,就是字典正文之前的那些按拼音查詢,按部首查詢,按筆畫查詢的附錄。它們描述了正文中的文字的排序位置,但是他們跟正文是分開的。非聚集索引,它跟資料的組織順序是毫無關係的,它用一系列指標來指向資料行,從而來描述資料行的位置。

不含有聚集索引的表,叫做堆表,它的資料行組織順序,是沒有特定順序的,類似於一堆書,增加一本書就放在這堆書的上面(在堆表中,具體實現方式可能不一樣)。

聚集索引對查詢效能影響非常大。聚集表中,非聚集索引是根據聚集鍵來定位的,而堆表中,非聚集索引是根據資料行號來定位的。這將有很大的效能區別,前者的效能大大優於後者。所以,建立合適的聚集索引,是非常必要的。乙個好的建議是,使用小字段的且值唯一的列來建立索引,而且最好是單列,可以是**鍵。因為如果欄位太大太多,用來進行排序的開銷將會很大,得不償失;如果列值不唯一,資料庫會為該重複值附加4位元組的資訊來標識重複值,增加了不必要的開銷。

通常,我們在建立表的時候會指定主鍵,如果不顯式指定索引型別的話,將預設建立聚集索引。比如:add constraintpk_tblprimary key (sid),將建立以sid為序的聚集索引。可以顯式指定主鍵上的索引型別,比如,add constraintpk_tblprimary key nonclustered(sid),將建立乙個非聚集索引的主鍵。所以,在建立主鍵的時候,一定得小心了,有多主鍵的情況,要注意顯式指定索引型別。

索引能大幅度提高查詢和排序效能,但是,在插入,刪除,以及修改了主鍵的操作中,是需要維護索引順序的。如果一張頻繁變更的表,是不宜建立過多的索引的,索引帶來的負面效能影響,將會得不償失。

索引優化,是乙個很考究的事情,它需要找到乙個平衡點。

一般來說,有以下幾個建議來建立合適的索引:

1.超過300行的資料表要建立索引(無視掉)

2.聚集索引字段不能過多,最好是單字段,而且列值唯一

3.對於資料字段特別多的表,而且這些欄位有很多出現在where中,不宜在每乙個欄位上建立單獨的索引,而是建立組合索引。組合索引中,列的順序是很講究的,越是選擇性大而且唯一的列要放在前面,這對查詢優化器優化有很大的幫助。不宜在那些大量重複的列值上建立索引,比如在乙個true,false的列上建索引,是毫無意義的。

4.如果查詢中,查詢的字段不多,可以考慮建立覆蓋索引,將字段都包含在索引裡,可以僅僅訪問索引就能查詢到所有資料,而不用表掃瞄。

資料庫查詢效能調優和索引優化

查詢效能調優是個很大的話題,這裡邊涉及到的技術非常廣泛,但是我們一般可以把它大致分為以下幾個層次 1.減少資料訪問。相關的技術就是建立合適的索引,將全表掃瞄 索引掃瞄 scan 等耗時的操作轉化為索引查詢 seek 建立正確的索引,能讓資料庫查詢效能提公升100 1000倍甚至更高,就好比一本非常厚...

資料庫查詢效能調優和索引優化

查詢效能調優是個很大的話題,這裡邊涉及到的技術非常廣泛,但是我們一般可以把它大致分為以下幾個層次 1.減少資料訪問。相關的技術就是建立合適的索引,將全表掃瞄 索引掃瞄 scan 等耗時的操作轉化為索引查詢 seek 建立正確的索引,能讓資料庫查詢效能提公升100 1000倍甚至更高,就好比一本非常厚...

剖析資料庫效能調優技術之索引調優

剖析資料庫效能調優技術之索引調優 2008 1 28 9 37 00 by iulu 一 概述 隨著資料庫在各個領域的使用不斷增長,越來越多的應用提出了高效能的要求。資料庫效能調優是知識密集型的學科,需要綜合考慮各種複雜的因素 資料庫緩衝區的大小 索引的建立 語句改寫等等。總之,資料庫效能調優的目的...