剖析資料庫效能調優技術之索引調優
[ 2008-1-28 9:37:00 | by: iulu ]
一、概述
隨著資料庫在各個領域的使用不斷增長,越來越多的應用提出了高效能的要求。資料庫效能調優是知識密集型的學科,需要綜合考慮各種複雜的因素:資料庫緩衝區的大小、索引的建立、語句改寫等等。總之,資料庫效能調優的目的在於使系統執行得更快。
調優需要有廣泛的知識,這使得它既簡單又複雜。
說調優簡單,是因為調優者不必糾纏於複雜的公式和規則。許多學術界和業界的研究者都在嘗試將調優和查詢處理建立在數學基礎之上。
稱調優複雜,是因為如果要完全理解常識所依賴的原理,還需要對應用、資料庫管理系統、作業系統以及硬體有廣泛而深刻的理解。
資料庫調優技術可以在不同的資料庫系統中使用。如果需要調優資料庫系統,最好掌握如下知識:
(1)查詢處理、併發控制以及資料庫恢復的知識;(2)一些調優的基本原則。
這裡主要描述索引調優。
二、索引調優
索引是建立在表上的一種資料組織,它能提高訪問表中一條或多條記錄的特定查詢效率。因此,適當的索引調優是很重要的。
對於索引調優存在如下的幾個誤區:
誤區1:索引建立得越多越好?
實際上:建立的索引可能建立後從來未使用。索引的建立也是需要代價的,對於刪除、某些更新、插入操作,對於每個索引都要進行相應的刪除、更新、插入操作。從而導致刪除、某些更新、插入操作的效率變低。
誤區2:對於乙個單錶的查詢,可以索引1進行過濾再使用索引2進行過濾?
實際上:假設查詢語句如下select * from t1 where c1=1 and c2=2,c1列和c2列上分別建有索引ic1、ic2。先使用ic1(或ic2)進行過濾,產生的結果集是臨時資料,不再具有索引,所以不可使用ic2(或ic1)進行再次過濾。
索引優化的基本原則:
1.將索引和資料存放到不同的檔案組
沒有將表資料和索引資料儲存到不同的檔案組,而不加區別地將它們儲存到同一檔案組。這樣,不但會造成i/o競爭,也為資料庫的維護工作帶來不變。
2.組合索引的使用
假設存在組合索引it1c1c2(c1,c2),查詢語句select * from t1 where c1=1 and c2=2能夠使用該索引。查詢語句select * from t1 where c1=1也能夠使用該索引。但是,查詢語句select * from t1 where c2=2不能夠使用該索引,因為沒有組合索引的引導列,即,要想使用c2列進行查詢,必需出現c1等於某值。
根據where條件的不同,歸納如下:
(1)c1=1 and c2=2:使用索引it1c1c2進行等值查詢。
(2)c1=1 and c2>2:使用索引it1c1c2進行範圍查詢,可以有兩種方法。
方法1,使用通過索引鍵(1,2)在b樹中命中一條記錄,然後向後掃瞄找出 第一條符合條件的記錄,從此記錄往後的每一條記錄都是符合條件的。這種方法的弊端在於:如果c1=1 and c2=2對應的記錄數很多,會產生很多無效的掃瞄。
方法2,如果c2對應的int型資料,可以使用索引鍵(1,3)在b樹中命中一條記錄,從此記錄往後的每一條記錄都是符合條件的。
本文中的例子均採用方法1。
(3)c1>1 and c2=2:因為索引的第乙個列不是等於號的,索引即使後面出現了c2=2,也不能將c2=2應用於索引查詢。這裡,通過索引鍵(1,- ∞)在b樹中命中一條記錄,向後掃瞄找出第一條符合c1>1的記錄,此後的每一條記錄判斷是否符合c2=2,如果符合則輸出,否則過濾掉。這裡我們稱c2=2沒有參與到索引運算中去。這種情況在實際應用中經常出現。
(4)c1>1:通過索引鍵(1,- ∞) 在b樹中命中一條記錄,以此向後掃瞄找出第一條符合c1>1的記錄,此後的每條記錄都是符合條件的。
3.唯一索引與非唯一索引的差異
假設索引int1c1(c1)是唯一索引,對於查詢語句select c1 from t1 where c1=1,達夢資料庫使用索引鍵(1)命中b樹中一條記錄,命中之後直接返回該記錄(因為是唯一索引,所以最多只能有一條c1=1的記錄)。
假設索引it1c2(c2)是非唯一索引,對於查詢語句select c2 from t2 where c2=2,達夢資料庫使用索引鍵(2)命中b樹中一條記錄,返回該記錄,並繼續向後掃瞄,如果該記錄是滿足c=2,返回該記錄,繼續掃瞄,直到遇到第一條不符合條件c2=2的記錄。
於是,我們可以得知,對於不存在重複值的列,建立唯一索引優於建立非唯一索引。
4.非聚集索引的作用
每張表只可能乙個聚集索引,聚集索引用來組織真實資料。語句「create table employee (id int cluster primary key,name varchar(20),addr varchar(20))」。表employee的資料用id來組織。如果要查詢id=1000的員工記錄,只要用索引鍵(1000)命中該聚集索引。但是,對於要查詢name=』張三』的員工記錄就不能使用該索引了,需要進行全表掃瞄,對於每一條記錄判斷是否滿足name=』張三』,這樣會導致查詢效率非常低。
要使用聚集索引,必需提供id,我們只能提供name,於是需要引入乙個輔助結構實現name到id的轉換,這就是非聚集索引的作用。該非聚集索引的鍵是name,值是id。於是語句「select * from employee where name=』張三』」的執行流程是:通過鍵(』張三』)命中非聚集索引,得到對應的id值3(假設』張三』對應的id為3),然後用鍵(3)命中聚集索引,得到相應的記錄。
5.是不是使用非聚集索引的查詢都需要進行聚集的查詢?
不是的,雖然在上一點中查詢轉換為聚集索引的查詢,有時候可以只需要使用非聚集索引。
建立表並建立相應的索引:create table t1(c1 int,c2 int,c3 int);create index it1c2c3 on t1(c2,c3)。查詢語句為:select c3 from t1 where c2=1。
因為索引it1c2c3(c2,c3)覆蓋查詢語句中的列(c2,c3)。所以,該查詢語句的執行流程為:通過索引鍵(1,- ∞)命中索引it1c2c3,對於該記錄直接返回c3對應的值,繼續向後掃瞄,如果索引記錄中c1還是等於1,那麼輸出c3,以此類推,直到出現第一條c1不等於1的索引記錄,結束查詢。
6.建立索引的規則
建立索引首先要考慮的是列的可選擇性。比較一下列中唯一鍵的數量和表中記錄的行數,就可以判斷該列的可選擇性。如果該列的「唯一鍵的數量/表中記錄行數」的比值越接近於1,則該列的可選擇行越高。在可選擇性高的列上進行查詢,返回的資料就較少,比較適合索引查詢。相反,比如性別列上只有兩個值,可選擇行就很小,不適合索引查詢
資料庫效能調優技術系列文章 1 索引調優
資料庫效能調優技術系列文章 1 索引調優 一 概述 隨著資料庫在各個領域的使用不斷增長,越來越多的應用提出了高效能的要求。資料庫效能調優是知識密集型的學科,需要綜合考慮各種複雜的因素 資料庫緩衝區的大小 索引的建立 語句改寫等等。總之,資料庫效能調優的目的在於使系統執行得更快。調優需要有廣泛的知識,...
資料庫效能調優 三
影響資料庫效能的主要因素 伺服器硬體的因素 伺服器數量 記憶體 cpu 磁碟 cpu 單台雙cpu 磁碟 高轉速 越高越高,1w以上 硬碟的插槽支援雙通道,記憶體型號一樣.網路環境 盡可能組建分布式的平台,使用raid 資料庫設計 資料查詢 伺服器硬體及網路的建議 增加伺服器的數量,組建分布式平台 ...
資料庫調優 2 索引
一 建立索引技巧 應該選擇資料量大的表。應該選擇使用頻繁的字段上建立索引,如經常查詢的字段,排序的字段,用於where子句作為條件判斷的字段。經常用在連線的列。應該選擇重複值較小的字段上建立所以,例如使用者表 應該在使用者id上建立索引,而不是使用者的位址如省份或者性別。當修改效能遠遠大於檢索效能時...