聚簇索引:(非索引類型,只是一種數據存儲方式) 表數據按照索引順序存儲,葉子結點存儲了真實數據行,一張表上面最多只能創建一個聚簇索引。
聚簇索引
如圖:葉子頁中包含了行的全部數據,但是節點頁只包含了索引列。
其他非聚簇索引的結構的,葉子節點中仍然是索引節點,只不過是有指向其對應數據塊的指針。
優點:
- 可以把相關數據保存在一起,例如電子郵箱中,根據用戶ID來聚集數據,這樣就可以磁盤讀取少量的數據頁便可以讀取到某個用戶的全部郵件
- 數據訪問更塊,聚簇索引將數據和索引保存在同一個B-Tree中,直接能從聚簇索引中獲取數據
缺點:
聚簇索引按照順序存儲且在葉子節點中存儲真實數據行會導致數據更新等操作比較麻煩
- 插入速度依賴于插入順序
- 更新聚簇索引代價很高
- 全表掃描很慢
如下表例子:
id | name | gender | total_score | city |
---|---|---|---|---|
1 | Jolly | Female | 500 | London |
2 | Jon | Male | 545 | Manchester |
3 | Sara | Female | 600 | Leeds |
4 | Laura | Female | 400 | Liverpool |
5 | Alan | Male | 500 | London |
6 | Kate | Female | 500 | Liverpool |
7 | Joseph | Male | 643 | London |
8 | Mice | Male | 543 | Liverpool |
9 | Wise | Male | 499 | Manchester |
10 | Elis | Female | 400 | Leeds |
Sqlserver中可以選擇索引作為聚簇索引,比如
CREATE CLUSTERED INDEX IX_tblStudent_Gender_Score ON student(gender ASC, total_score DESC)
根據用戶的性別(gender)和總得分(total_score)創建聚簇索引,找所有記錄的結果便會是:
id | name | gender | total_score | city |
---|---|---|---|---|
3 | Sara | Female | 600 | Leeds |
1 | Jolly | Female | 500 | London |
6 | Kate | Female | 500 | Liverpool |
4 | Laura | Female | 400 | Liverpool |
10 | Elis | Female | 400 | Leeds |
7 | Joseph | Male | 643 | London |
2 | Jon | Male | 545 | Manchester |
8 | Mice | Male | 543 | Liverpool |
5 | Alan | Male | 500 | London |
9 | Wise | Male | 499 | Manchester |
mysql 中并不支持自選索引作為聚簇索引,對于InnoDB,一般通過主鍵聚集數據,如果沒有主鍵列,便會選擇一個唯一的非空索引代替,如果沒有這樣的索引,InnoDB會隱式定義一個主鍵來作為聚簇索引。
覆蓋索引: 一個索引包含所有需要查詢的字段的值,我們稱為覆蓋索引。
需要查詢字段的值,即覆蓋索引必須要存儲索引列的值。所以Mysql只能使用B-Tree索引做覆蓋索引。