索引分類:從物理結構上可分為兩種:聚集索引和非聚集索引 (此外還有空間索引、篩選索引、XML索引)
因為聚集索引是索引順序與物理存儲順序一致,所以只能建一個。
- 聚集索引就是把數據按主鍵順序存儲;
- 因為一張表中的數據只能有一個物理順序,所以一張表只能有一個主鍵/聚集索引。
非聚集索引可以建1或者N個。
並不是所有字段上都可以建索引,有的字段類型如text、image、nvarchar(max)等是不可以建索引的。
sql語句有多個條件用and連接時,多個字段都有索引的話,順序很重要。
索引是存在磁盤的文件,一個表上如果有100個列,但是不能建太多索引,因為進行插入,修改,刪除時都需要對索引文件進行修改,會影響增刪改的效率,所以要平衡索引的個數。
索引的數據結構長什么樣子呢?
講了索引概念和結構。
在SQL Server數據庫中,索引的存儲是以B+樹(注意和二叉樹的區別)結構來存儲的,又稱索引樹,其節點類型為如下兩種:
- 索引節點;
- 葉子節點
索引節點按照層級關系,有時又可以分為根節點和中間節點,其本質是一樣的,都只包含下一層節點的入口值和入口指針;
葉子節點就不同了,它包含數據,這個數據可能是表中真實的數據行,也有可能是索引列值和行書簽,前者對應於聚集索引,后者對應於非聚集索引。
通過DBCC IND命令來查看索引的情況
DBCC IND ([PCT], [DBO.Employee], -1)
具體例子可以到上文的博客處查看。
非聚集索引的include理解,這個索引的數據結構息息相關。
- 索引覆蓋和非聚集索引的根節點和中間節點一樣,都是索引頁,都只包含下一層的入口指針和入口值。
- 索引覆蓋的葉節點卻稍有不同,多了一列DepartmentCode,此列即為索引覆蓋列,而且此列只在葉節點出現,如果查詢時,只需返回鍵值列和索引覆蓋列,則只需索引查找,肯本無需訪問數據頁,不僅提高了性能,而且節省占用空間。
本次優化記錄:
1,把多個and order_State<>2 and order_State<>-1and order_State<>-10and order_State<>-20等修改成,and order_State not in(-20,-10,-1,2)查詢速度快了很多。
2,在DateTime字段上建了索引,又提高了幾秒。
下面的表格闡述了什么時候應該用非簇聚索引,什么時候用簇聚索引:
動作描述 | 使用聚集索引 | 使用非聚集索引 |
列經常被分組排序 | 應 | 應 |
返回某范圍內的數據 | 應 | 不應 |
一個或極少不同值 | 不應 | 不應 |
小數目的不同值 | 應 | 不應 |
大數目的不同值 | 不應 | 應 |
頻繁更新的列 | 不應 | 應 |
外鍵列 | 應 | 應 |
主鍵列 | 應 | 應 |
頻繁修改索引列 | 不應 | 應 |
把流水表修改成一個單表,增加字段數,嘗試優化。
文章:SQL Server基礎之索引 待閱讀。