索引-分类
- 索引按种类分为主键索引,唯一索引,普通索引
- 按数据结构分为B+树索引和哈希索引
- 按创建类型分聚簇索引和非聚簇索引
- 聚簇索引就是以主键创建的索引
- 非聚簇索引就是以非主键创建的索引
- 聚簇索引在叶子节点存储的是表中数据,非聚簇存的是主键和索引列
- 非聚簇查询时,拿到主键再去查找想要的数据(回表)
基本概念
首先我们要知道数据库是如何存储数据的
上面的图片代表一页 ;
每个数据页组成一个双向链表 ;
而每个数据页中的记录又组成一个单向链表 ;
其中每一页都会根据主键生成一个页目录,可利用二分法快速定位 ;
以其他列做搜索条件时从最小记录开始依次遍历,检索每一页,因此索引作用体现于此;
索引的实现
时间复杂度:O(log2N)
B-Tree;
层:d,为大于1的正整数 ;
高度:h ;
每个非叶子节点由n-1个key和n个指针组成,其中d<=n<=2d ;
每个叶子节点最少包含一个key和两个指针,最多包含2d-1个key和2d个指针,叶节点的指针均为null ;
所有叶子节点具有相同的深度,等于树高h ;
key和指针相互间隔,节点两端是指针 ;
一个节点中的key从左到右非递减排列;
查找算法:首先从根节点进行二分查找,如果找到则返回对应节点的data,否则对相应区间的指针指向的节点递归进行查找,直到找到节点或找到null指针,前者查找成功,后者查找失败。
时间复杂度:O(logdN)
索引总结
最左匹配原则
尽量选择区分度高的列作为索引
索引列不能参与计算
尽可能扩展索引而不是新建索引
单个多列组合索引和多个单列组合索引检索查询效果不同
索引本身也是有代价的,消耗存储空间,降低增删改效率