索引分类:从物理结构上可分为两种:聚集索引和非聚集索引 (此外还有空间索引、筛选索引、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字段上建了索引,又提高了几秒。
下面的表格阐述了什么时候应该用非簇聚索引,什么时候用簇聚索引:
动作描述 | 使用聚集索引 | 使用非聚集索引 |
列经常被分组排序 | 应 | 应 |
返回某范围内的数据 | 应 | 不应 |
一个或极少不同值 | 不应 | 不应 |
小数目的不同值 | 应 | 不应 |
大数目的不同值 | 不应 | 应 |
频繁更新的列 | 不应 | 应 |
外键列 | 应 | 应 |
主键列 | 应 | 应 |
频繁修改索引列 | 不应 | 应 |
把流水表修改成一个单表,增加字段数,尝试优化。
文章: 待阅读。