按照存儲方式分爲:聚集與非聚集索引
按照維護與管理索引角度分爲:唯一索引、複合索引和系統自動創建的索引
2、索引目的和代價:
索引是表的一個概念部分,目的是減少全表掃描,用來提高檢索數據的效率.
它的代價. 索引需要空間來存儲,也需要定期維護, 每當有記錄在表中增減或索引列被修改時, 索引本身也會被修改. 這意味着每條記錄的INSERT , DELETE , UPDATE將爲此多付出4 , 5 次的磁盤I/O . 因爲索引需要額外的存儲空間和處理,那些不必要的索引或者不合理的索引反而會使查詢變慢.
常見的兩種索引:聚集索引(clustered index,也稱聚類索引、簇集索引)和非聚集索引(nonclustered index,也稱非聚類索引、非簇集索引)。
3、聚集索引:(表中存儲的數據按照索引的順序存儲,檢索效率比普通索引高,但對數據新增/修改/刪除的影響比較大)
1、一張表只能包含一個聚集索引,但並非只有一列,該索引可以包含多個列(組合索引),就像電話簿按姓氏和名字進行組織一樣。
1、一張表只能包含一個聚集索引,但並非只有一列,該索引可以包含多個列(組合索引),就像電話簿按姓氏和名字進行組織一樣。
2、在聚集索引中,表中各行的存儲(物理)順序與鍵值的邏輯(索引)順序相同;
3、聚集索引通常可加快UPDATE和DELETE操作的速度,因爲這兩個操作需要讀取大量的數據;
4、創建或修改聚集索引可能要花很長時間,因爲執行這兩個操作時要在磁盤上對錶的行進行重組;
5、另一個使用索引的好處是,它提供了主鍵(primary key)的唯一性驗證. (其實本人也不知道爲什麼它就提供了唯一性驗證呢,希望達人可以講解.)
創建聚集索引的語法:
create CLUSTERED INDEX idximpID ON EMP(empID)
創建聚集索引的語法:
create CLUSTERED INDEX idximpID ON EMP(empID)
4、非聚集索引:
1、一個表可以最多可以創建249個非聚集索引
1、一個表可以最多可以創建249個非聚集索引
2、先建聚集索引才能創建非聚集索引(有待確認)
3、非聚集索引數據的物理存儲順序與非聚集索引列不同
4、數據存儲地址與索引存儲地址在不同位置
5、索引在葉節點上存儲,在葉節點上有一個“指針”直接指向要查詢的數據的存儲位置
6、數據不會根據索引鍵的順序重新排列數據
語法:
create NONCLUSTERED INDEX idxempID on emp(empID)
create NONCLUSTERED INDEX idxempID on emp(empID)
5、複合索引:如果在兩上以上的列上創建一個索引,則稱爲複合索引。
那麼,不可能有兩行的姓和名是重複的
語法:
create index indexfullname on addressbook(firstname,lastname)
那麼,不可能有兩行的姓和名是重複的
語法:
create index indexfullname on addressbook(firstname,lastname)
6、惟一索引:惟一索引可以確保索引列不包含重複的值.
可以用多個列,但是索引可以確保索引列中每個值組合都是唯一的
舉個例子:姓和名是一個很好的例子,也很容易理解.
姓 名
李 二
張 三
王 五
語法: create unique index idxempid on emp(姓,名)
可以用多個列,但是索引可以確保索引列中每個值組合都是唯一的
舉個例子:姓和名是一個很好的例子,也很容易理解.
姓 名
李 二
張 三
王 五
語法: create unique index idxempid on emp(姓,名)
系統自建的索引:在使用T_sql語句創建表的時候使用PRIMARY KEY或UNIQUE約束時,會在表上自動創建一個惟一索引
7、生活中的索引--字典:
字典中按拼音查找--聚集索引
正文內容本身就是一種按照一定規則排列的目錄稱爲“聚集索引”。
按部首---非聚集索引
這種目錄純粹是目錄,正文純粹是正文的排序方式稱爲“非聚集索引”,可以通過目錄索引到正文。
字典中按拼音查找--聚集索引
正文內容本身就是一種按照一定規則排列的目錄稱爲“聚集索引”。
按部首---非聚集索引
這種目錄純粹是目錄,正文純粹是正文的排序方式稱爲“非聚集索引”,可以通過目錄索引到正文。
8、何時使用聚集索引或非聚集索引
以下,引用某位總結的表格:
動作描述 | 使用聚集索引 | 使用非聚集索引 |
列經常被分組排序 | 應 | 應 |
返回某範圍內的數據 | 應 | 不應 |
一個或極少不同值 | 不應 | 不應 |
小數目的不同值 | 應 | 不應 |
大數目的不同值 | 不應 | 應 |
頻繁更新的列 | 不應 | 應 |
外鍵列 | 應 | 應 |
主鍵列 | 應 | 應 |
頻繁修改索引列 | 不應 | 應 |
其實你只要知道:
1、聚集索引是存儲的順序和索引的順序一致
2、非聚集索引是通過非聚集索引的指針來再來查詢數據的存儲位置
從原理的角度來分析一下如何才能更快地索引到存儲位置,就可以把握這種什麼時候需要建立哪一種索引的原則了.