1. 程式人生 > >SQL 使用總結四(關於索引)

SQL 使用總結四(關於索引)

目錄

介紹

索引的型別

何時考慮使用索引

何時應該避免使用索引

刪除索引

SQL SERVER中的索引

1、簡述

2、說明

3、例子


 

介紹

簡單來說,索引就是指標,指向表裡的資料。資料庫裡的索引和圖書中的索引十分類似。當資料庫沒有索引是,它所進行的操作通常被稱作全表掃描。

索引通常是和表分開儲存的,其主要目的是提高資料庫檢索的效能。索引的建立和刪除不會影響到資料本身,但會影響資料檢索的速度。索引也會佔據物理儲存空間,而且可能迴避表本身還大。因此在考慮資料庫的儲存空間時,需要考慮索引要佔用的空間。

 

索引的型別

單字索引(對單個欄位的索引),組合索引(對多個欄位的索引。因為欄位在索引裡的次序對資料檢索速度有很大的影響,一般最具有限制的值應該排在前面,從而得到更好的效能)和唯一索引(不允許表裡有重複值),隱含索引(資料庫伺服器程式在建立物件時自動建立的)

 

何時考慮使用索引

1、主鍵、外來鍵;一般來說,大多數用於表結合的欄位都應該設定索引。

2、經常在ORDER BY 和GROUP BY裡引用的欄位也應該考慮設定索引。

3、具有大量唯一值的欄位,或是在where子句裡會返回很小部分記錄的欄位,都可以考慮設定索引。

 

何時應該避免使用索引

雖然使用索引的初衷是提高資料庫的效能,但有時也要避免使用它們。下面是使用索引的方針。

  • 索引不應該用於小規模的表。因為查詢索引會增加額外的查詢時間。對於小規模的表, 讓搜尋引擎進行全表搜尋,往往比先查詢索引的速度更快。
  • 當欄位用於WHERE子句作為過濾器會返回表裡的大部分記錄時,該欄位就不合適設定索引。例如性別。
  • 經常會被批量更新的表可以具有索引,但批量操作的效能會由於索引而下降。對於經常會被載入或批量操作的表來說,可以在執行批量操作之前去除索引,在完成操作後再重新建立索引。這是因為當表裡插入資料時,索引也會被更新,從而增加了額外的開銷。
  • 不應該對包含大量NULL值的欄位設定索引。欄位中過多的NULL值會嚴重影響索引的執行效率。
  • 經常被操作的欄位不應設定索引,因為對索引的維護變的很繁重。

 

刪除索引

刪除索引最常見的原因是嘗試改善效能。記住,刪除索引後,我們還可以重新建立它。有時候重建索引是為了減少碎片。在探索如何讓資料庫具有最佳效能時,調整索引是個必要的過程,其中可能包含建立索引、刪除、最後在重新建立。

 

SQL SERVER中的索引

1、簡述

在sql server 中索引分為聚簇索引和非聚簇索引。聚集索引是一種對磁碟上實際資料重新組織以按指定的一列或多列值排序。一個表只能建立一個聚集索引。非聚簇索引不重新組織表中的資料,而是對每一行儲存索引列值並用一個指標指向資料所在的頁面。一個表可以擁有多個非聚集索引,每個非聚集索引根據索引列的不同提供不同的排序順序。

語法

CREATE [UNIQUE] [CLUSTERED| NONCLUSTERED ]
INDEX index_name ON { table | view } ( column [ ASC | DESC ] [ ,...n ] )
[with[PAD_INDEX][[,]FILLFACTOR=fillfactor]
[[,]IGNORE_DUP_KEY]
[[,]DROP_EXISTING]
[[,]STATISTICS_NORECOMPUTE]
[[,]SORT_IN_TEMPDB]
]
[ ON filegroup ]

 

2、說明

CREATE INDEX命令建立索引各引數說明如下:

UNIQUE:用於指定為表或檢視建立唯一索引,即不允許存在索引值相同的兩行。

CLUSTERED:用於指定建立的索引為聚集索引。

NONCLUSTERED:用於指定建立的索引為非聚集索引。

index_name:用於指定所建立的索引的名稱。

table:用於指定建立索引的表的名稱。

view:用於指定建立索引的檢視的名稱。

ASC|DESC:用於指定具體某個索引列的升序或降序排序方向。

Column:用於指定被索引的列。

PAD_INDEX:用於指定索引中間級中每個頁(節點)上保持開放的空間。

FILLFACTOR = fillfactor:用於指定在建立索引時,每個索引頁的資料佔索引頁大小的百分比,fillfactor的值為1到100。

IGNORE_DUP_KEY:用於控制當往包含於一個唯一聚集索引中的列中插入重複資料時SQL Server所作的反應。

DROP_EXISTING:用於指定應刪除並重新建立已命名的先前存在的聚集索引或者非聚集索引。

STATISTICS_NORECOMPUTE:用於指定過期的索引統計不會自動重新計算。

SORT_IN_TEMPDB:用於指定建立索引時的中間排序結果將儲存在 tempdb 資料庫中。

ON filegroup:用於指定存放索引的檔案組。

 

3、例子

--表bigdata建立一個名為idx_mobiel的非聚集索引,索引欄位為mobiel

create index idx_mobiel
on bigdata(mobiel) 

--表bigdata建立一個名為idx_id的唯一聚集索引,索引欄位為id

--要求成批插入資料時忽略重複值,不重新計算統計資訊,填充因子為40

create unique clustered index idx_id
on bigdata(id) 
with pad_index,
fillfactor=40,
ignore_dup_key,
statistics_norecompute