資料庫索引設計與優化

2021-08-14 22:29:55 字數 3418 閱讀 9140

1.什麼是索引

在資料庫中,索引的含義與日常意義上的「索引」一詞並無多大區別(想想小時候查字典),它是用於提高資料庫表資料訪問速度的資料庫物件。

a)索引可以避免全表掃瞄。多數查詢可以僅掃瞄少量索引頁及資料頁,而不是遍歷所有資料頁。

b)對於非聚集索引,有些查詢甚至可以不訪問資料頁。

c)聚集索引可以避免資料插入操作集中於表的最後乙個資料頁。

d)一些情況下,索引還可用於避免排序操作。

當然,眾所周知,雖然索引可以提高查詢速度,但是它們也會導致資料庫系統更新資料的效能下降,因為大部分資料更新需要同時更新索引。

例如這樣乙個查詢:select * from table1 where id=44。如果沒有索引,必須遍歷整個表,直到id等於44的這一行被找到為止;有了索引之後(必須是在id這一列上建立的索引),直接在索引裡面找44(也就是在id這一列找),就可以得知這一行的位置,也就是找到了這一行。可見,索引是用來定位的。

2.索引的儲存

一條索引記錄中包含的基本資訊包括:鍵值(即你定義索引時指定的所有欄位的值)+邏輯指標(指向資料頁或者另一索引頁)。

當你為一張空表建立索引時,資料庫系統將為你分配乙個索引頁,該索引頁在你插入資料前一直是空的。此頁此時既是根結點,也是葉結點。每當你往表中插入一行資料,資料庫系統即向此根結點中插入一行索引記錄。當根結點滿時,資料庫系統大抵按以下步驟進行**:

a)建立兩個兒子結點

b)將原根結點中的資料近似地拆成兩半,分別寫入新的兩個兒子結點

c)根結點中加上指向兩個兒子結點的指標

通常狀況下,由於索引記錄僅包含索引字段值(以及4-9位元組的指標),索引實體比真實的資料行要小許多,索引頁相較資料頁來說要密集許多。乙個索引頁可以儲存數量更多的索引記錄,這意味著在索引中查詢時在i/o上佔很大的優勢,理解這一點有助於從本質上了解使用索引的優勢。

3.索引的型別

a)  唯一索引:唯一索引不允許兩行具有相同索引值

b) 主鍵索引:定義乙個主鍵將自動建立主鍵索引,主鍵索引是唯一索引的特殊型別.要求每個值唯一的,並且不能為空。

c)聚集索引,表資料按照索引的順序來儲存的。對於聚集索引,葉子結點即儲存了真實的資料行,不再有另外單獨的資料頁,每個表只能乙個

d)非聚集索引,表資料儲存順序與索引順序無關。對於非聚集索引,資料儲存在乙個位置,索引儲存在另乙個位置,索引中包含指向資料儲存位置的指標。

4. 索引建立語法

crate [unique](唯一) [clustered](聚集) [nonclustered] index  索引名稱 on 表名(列名)
注:以上中的值根據需要選擇乙個

5.索引刪除語法

drop index 表名.索引名

sysindexes:系統索引表

6.索引優缺點

優點:建立索引可以大大提高系統的效能。

1):通過建立唯一性索引,可以保證資料庫表中每一行資料的唯一性。

2):可以大大加快資料的檢索速度,這也是建立索引的最主要的原因。

3):可以加速表和表之間的連線,特別是在實現資料的參考完整性方面特別有意義。

4):在使用分組和排序子句進行資料檢索時,同樣可以顯著減少查詢中分組和排序的時間。

5):通過使用索引,可以在查詢的過程中,使用優化隱藏器,提高系統的效能。

缺點:1):建立索引和維護索引要耗費時間,這種時間隨著資料量的增加而增加。

2):索引需要佔物理空間,除了資料表佔資料空間之外,每乙個索引還要佔一定的物理空間,如果要建立聚簇索引,那麼需要的空間就會更大。

3):當對表中的資料進行增加、刪除和修改的時候,索引也要動態的維護,這樣就降低了資料的維護速度。

7.在哪建索引

索引是建立在資料庫表中的某些列的上面。在建立索引的時候,應該考慮在哪些列上可以建立索引,在哪些列上不能建立索引。

一般來說,應該在這些列上建立索引:

1):在經常需要搜尋的列上,可以加快搜尋的速度;

2):在作為主鍵的列上,強制該列的唯一性和組織表中資料的排列結構;

3):在經常用在連線的列上,這些列主要是一些外來鍵,可以加快連線的速度;在經常需要根據範圍進行搜尋的列上建立索引,因為索引已經排序,其指定的範圍是連續的;

4):在經常需要排序的列上建立索引,因為索引已經排序,這樣查詢可以利用索引的排序,加快排序查詢時間;

5):在經常使用在where子句中的列上面建立索引,加快條件的判斷速度。

同樣,對於有些列不應該建立索引。一般來說,不應該建立索引的的這些列具有下列特點:

1):對於那些在查詢中很少使用或者參考的列不應該建立索引。這是因為,既然這些列很少使用到,因此有索引或者無索引,並不能提高查詢速度。

相反,由於增加了索引,反而降低了系統的維護速度和增大了空間需求。

2):對於那些只有很少資料值的列也不應該增加索引。這是因為,由於這些列的取值很少,例如人事表的性別列,在查詢的結果中,結果集的資料行佔了表中資料行的很大比例,

即需要在表中搜尋的資料行的比例很大。增加索引,並不能明顯加快檢索速度。

3):對於那些定義為text, image和bit資料型別的列不應該增加索引。這是因為,這些列的資料量要麼相當大,要麼取值很少,不利於使用索引。

4):當修改效能遠遠大於檢索效能時,不應該建立索引。這是因為,修改效能和檢索效能是互相矛盾的。當增加索引時,會提高檢索效能,但是會降低修改效能。

當減少索引時,會提高修改效能,降低檢索效能。因此,當修改操作遠遠多於檢索操作時,不應該建立索引。

使用索引的場景:

1. 當資料多且字段值有相同的值得時候用普通索引。

2. 當欄位多且字段值沒有重複的時候用唯一索引。

3. 當有多個欄位名都經常被查詢的話用復合索引。

4. 普通索引不支援空值,唯一索引支援空值。

5. 但是,若是這張表增刪改多而查詢較少的話,就不要建立索引了,因為如果你給一列建立了索引,那麼對該列進行增刪改的時候,都會先訪問這一列的索引,

6. 若是增,則在這一列的索引內以新填入的這個欄位名的值為名建立索引的子集,

7. 若是改,則會把原來的刪掉,再添入乙個以這個欄位名的新值為名建立索引的子集,

8. 若是刪,則會把索引中以這個字段為名的索引的子集刪掉。

9. 所以,會對增刪改的執行減緩速度,

10. 所以,若是這張表增刪改多而查詢較少的話,就不要建立索引了。

11. 更新太頻繁地字段不適合建立索引。

12. 不會出現在

where

條件中的字段不該建立索引。

資料庫索引 索引優化

二 三星索引 三 合適設計理想索引 謂詞簡單謂詞和複雜謂詞 where字句中的每個條件稱為乙個謂詞。過濾因子 描述了謂詞的選擇性,即表中滿足謂詞條件的記錄行數所佔的比例 過濾因子 ff 結果集的數量 錶行的數量 平均過濾因子 1 不同列值的數量 索引片及匹配列 乙個索引定義乙個索引片,如果where...

資料庫優化 索引

鑑於csdn無故刪除博文,本部落格不再更新,暫時遷至 2索引每一本書的前幾頁一般都是目錄,而最後幾頁通常會有乙個關鍵字索引。對於資料庫來講系統表 如 sysobjects等 就是目錄,而標字段上的索引就如同書本後面的關鍵字索引。資料庫中,目錄 資料字典 和索引的區別 目錄縱向 索引橫向。優化器根據統...

資料庫索引優化

索引的作用是告訴儲存引擎快速找到我們需要的資料,兩個極端,除了主鍵沒有任何索引,給每乙個列都建立乙個索引,所以索引是在mysql儲存引擎層實現的,而不是在mysql伺服器層實現的,不同的儲存引擎的索引方式是不同的,mysql支援的索引型別,b tree索引是比較常見的,通常所說的索引就是b tree...