六 資料庫規劃索引

2021-04-14 19:28:57 字數 2853 閱讀 2684

chapter 6 

規劃索引

現在我們先來做一下實驗,看一看有無索引對查詢速度的影響:在乙個有

1500000

條紀錄的表中,選擇一條資料,在無索引時用時:用時

9秒,而有索引時用時

0秒,開啟執行計畫可以看到更加詳細的紀錄

! 如果你訪問一家**,但是每開啟乙個網頁要等待

60秒,你還願意再次訪問嗎?由於索引能夠大副度提高提高效能,所以索引對於我們來說很重要

!我們現在就來看看索引如何改進資料庫的效能:

1- 我們先來介紹一下索引:

行以資料頁的形式儲存,每個資料頁包括

8k的資訊。每八個相連的資料頁被稱為乙個擴充套件,堆是表中資料頁的集合。

sql server

提供兩種方法來訪問資料:表掃瞄和使用索引。當我們使用表掃瞄時,就從表的開始開始,逐頁的掃瞄所有資料頁,並從中抽取滿足條件的行;當我們使用索引裡,遍歷索引樹結構來查詢要求的行,然後從資料頁上抽取這些滿足條件的行;在決定是否使用索引裡,

sql server

的優化器會決定對訪問資料來說,掃瞄表和使用索引結構哪個更加有效

! 任何事物都有兩面性,索引也是如此,它可以對資料的訪問速度,但是也會增加磁碟的空間使用和開銷

(維護索引和更新資料時) 2

.索引結構:

堆:如果我們沒有定義簇索引,

sql server

維護堆中的資料頁。它使用

iam頁來連線資料頁,瀏覽和查詢插入新行所需的空間,當行被刪除時,進行空間的**

簇索引:如果我們要指定關鍵值的範圍或者是進行排序查詢,則簇索引會非常有用。每個表只能有乙個簇索引,表的物理順序與索引中的物理順序是一致的,當索引被建立期間,它使用當前資料庫的空間,一般需要

1.2倍的表大小

! 非簇索引:這是我們建立索引的預設選擇。它於簇索引不同的就是它的頁級頁順序與表的物理順序不同,葉級頁以公升序排列。它有它可以在乙個表中建

249個非簇索引,而簇索引只能夠建乙個,因為我們知道乙個物理表只能夠擁有乙個物理順序

!它在簇索引被解除安裝,建立和使用

drop_existing

改變簇索引的列時會自動重建! 3

.sql server

如何檢索儲存的資料:

1.我們首先要使用

sysindexes

表,其中

indid為0

時為堆,這時

firstiam

指向表中資料頁集合的

iam頁鏈。為

1時此表上建有簇索引,

root

指向簇索引

b-tree

的根結構。為

2-250

時,為表中存在非簇索引。與簇索引相同,它也使用

root

列中的值指向非簇索引平衡樹的根結構! 2

.不使用索引而查詢行:此時使用表掃瞄來檢索行。剛才我們講到也

sysindexes

表,現在我們就要使用

sysindexes

表中的firstiam

來查詢iam

頁,因為

iam頁中包括有與表相關的所以頁的列表! 3

.使用非簇索引在堆中查詢行:

b-tree

;它像乙個帶有索引的課本,索引存在乙個地方而資料存在另乙個地方。在葉級索引頁上的指標指示了索引條目的儲存位置

!這個指標

(rid)

是由檔案

id,頁

id,和行

id組成! 4

.使用簇索引來查詢行:簇索引和非簇索引與

b-tree

都很相似:但是與非簇索引的不同之處在於:它的葉級頁就是資料頁,同時簇索引中的資料行被排序並根據其簇關鍵字進行儲存

!它就像乙個**號碼表目錄,同姓的人被分到書的同一部份。我們要保持簇索引中的關鍵字較小,此時可以減少

i/0;

5.使用帶有非簇索引的簇索引來查詢行:它時非簇索引的行定位符不是以前的那個由檔案

id,頁

id和行

id組成的

rid了,而是簇關鍵字索引值

! 由於在遍歷簇索引結構和非簇索引結構,所以產生附加的

i/o。由時由於

簇索引的字值都大於堆中的8位

rid,所以要保持簇索引中的關鍵字較小! 4

.sql server

如何維護索引和堆:

1.頁拆分:簇索引將被插入和更新的行指向特定的頁,該頁由簇索引關鍵字的值決定

!如果資料頁或索引頁沒有足夠的空間來容納資料,那麼在頁**過程中將增加新的頁,同時大約一半的資料還留在老的頁中,一半將留在新的頁中

! 邏輯上看,新的頁是接著老的頁的,但是物理上說,新的頁與老的頁可能被指派到任何可用的頁。所以如果乙個索引產生的大量的頁**,我們要重建索引來改進效能! 2

.堆中的**指標:堆中不發生頁**。只要有空間可以使用就可以插入新行

!但是如果我們對行的更新需要比當前頁中的可使用空間更多的空間,行就被移到新的頁中。行在原位置會留下乙個**指標,由這個指標指向被移到的新的行

! 如果堆中有非簇索引,那麼儘管插入和更新在堆中不會發生頁**,但是在非簇索引上可能會產生頁**! 3

.行更新:在堆中,如果更新沒有增大記錄或者就算增大了記錄但在該頁仍可存放時,導致行的移到

!批量更新只涉及到每個索引一次! 4

.行刪除:如果我們從資料頁上刪除了頁上的最後一行,那麼該資料頁將整修消失

! 在索引中的行如果被刪除,那麼它的空間可被相鄰的行使用,但是會遺留下一些空隙

! 在堆中刪除行並不被壓縮,直到該空間被要求用插入

! 幽靈記錄:

5.決定在哪一列上建立索引:查詢,高選擇性和低密度

資料庫(六)索引

索引是一種特殊的資料庫結構,是提高資料庫效能的重要方式,可以用來快速查詢資料庫表中的特定記錄,mysql中所有的資料型別都可以被索引。mysql的索引包括普通索引 唯一性索引 全文索引 單列索引 多列索引和空間索引等。6.1索引概述 在mysql中,索引由資料表中一列或多列組合而成,建立索引的目的是...

MySQL資料庫(六) 索引

索引是一種提高查詢效率的資料結構 b樹或雜湊結構 索引是建立在資料庫表中,對資料庫表中的一列或多列值進行排序的結果,好處是提高查詢效率。1 普通索引 無任何限制,可以給任意字段建立普通索引。2 唯一性索引 使用unique修飾的字段,值不可以重複。3 主鍵索引 使用primary key修飾的字段自...

資料庫 資料庫索引

索引是儲存引擎用於快速找到記錄的一種資料結構。索引以檔案的形式儲存在磁碟中。索引可以包含乙個或多個列的值。儲存引擎查詢資料的時候,先在索引中找對應值,然後根據匹配的索引記錄找到對應的資料行。1.b tree索引 2.雜湊索引 myisam和innodb儲存引擎 只支援btree索引,也就是說預設使用...