索引
聚集索引和非聚集索引,常规了,看下面的两张图
1)聚集索引叶子节点就是实际数据(数据页),索引指向的是数据页,索引页每一行记录了数据页和聚集索引字段在该数据页的范围
若where 后面的字段不包含创建聚集索引时的第一个字段,并且包含在创建聚集索引时的字段列中,进行索引扫描
若where 后面要查找的字段是建立聚集索引时的第一个字段,或者就是创建聚集索引时的字段列,进行索引查找
否则全表扫描
2)非聚集索引叶子还是索引,每索引行都有索引列的值和数据行地址,有多少数据行就有多少索引行
若where 后面要查找的字段不是建立非聚集索引时的第一个字段,并且包含在创建非聚集索引时的字段列中,这个字段已经保存在非聚集索引的索引页里了,进行索引扫描
若where 后面要查找的字段是建立非聚集索引时的第一个字段,或者就是创建非聚集索引时的字段列,进行索引查找
否则全表扫描
动作描述 | 使用聚集索引 | 使用非聚集索引 |
列经常被分组排序 | 应 | 应 |
返回某范围内的数据 | 应 | 不应 |
一个或极少不同值 | 不应 | 不应 |
小数目的不同值 | 应 | 不应 |
大数目的不同值 | 不应 | 应 |
频繁更新的列 | 不应 | 应 |
外键列 | 应 | 应 |
主键列 | 应 | 应 |
频繁修改索引列 | 不应 | 应 |
参考文章:
1. SQLSERVER聚集索引与非聚集索引的再次研究(上)
2. Oracle B-tree 索引结构、如何存储及其优势