索引数据结构
平衡树(非二叉) b-tree或b+ tree
- 叶子节点是实际的数据,数据在数据库中按页存储在磁盘上。
- 磁盘读写数据也是按照 “页” 为单位 一页一页地读取到内存。
- 建立了索引的表,表里面的数据是放在B树数据结构的索引页,而不是堆数据结构的数据页
组合索引
组合索引“最左前缀”
比如 :将 name, city, age建到一个索引里
建立这样的组合索引,其实是相当于分别建立了下面三组组合索引:
name,city,age; name,city; name
聚集索引和非聚集索引区别
聚集索引:
- 一张表只能有一个聚集索引
- 通过聚集索引可以查到需要查找的数据
非聚集索引
- 一张表可以有多个非聚集索引,但是有最大数量限制
- 通过非聚集索引可以查到记录对应的主键值,再使用主键的值通过聚集索引查找到需要的数据
- 独立于数据表的结构,所以可以被放置在不同的文件组,使用不同的I/O路径,意味着SQL Server可以并行访问索引和表,使查找更快速。
索引优缺点
优点:
- 能让数据库查询数据的速度上升。(合理使用索引会加快查询速度)
缺点:
- 给表添加索引,会增加表的体积, 占用磁盘存储空间。
- 因为平衡树这个结构必须一直维持在一个正确的状态, 增删改数据都会改变平衡树各节点中的索引数据内容,破坏树结构, 因此,在每次数据改变时, DBMS必须去重新梳理树(索引)的结构以确保它的正确,这会带来不小的性能开销,也就是为什么索引会给查询以外的操作带来副作用的原因。
使用建议
- 主键尽量用数字类型作为聚集索引。
- 外键和join关联字段添加索引。
- Where 条件字段添加索引。
- 状态枚举值少的索引效果不好,甚至会引发全表扫描。
- select字段可以添加到非聚集索引的Include里。
非聚集索引的交叉
如果一个表有多个索引,那么SQL Server可以使用多个索引来执行一个查询。SQL Server可以利用多个索引,根据每个索引选择小的数据子集,然后执行两个子集的一个交叉(即只返回满足所有条件的那些行)。SQL Server可以在一个表上开发多个索引,然后使用一个算法来在两个子集中得到交叉(可以理解为求交集)
非聚集索引的本质是表,通过额外建立表使得几个非聚集索引之间进行像表一样的Join,从而使非聚集索引之间可以进行Join来在不访问基本表的情况下给查询优化器提供所需要的数据。