MySQL索引的实现和原理

索引-分类

  1. 索引按种类分为主键索引,唯一索引,普通索引
  2. 按数据结构分为B+树索引和哈希索引
  3. 按创建类型分聚簇索引和非聚簇索引
  4. 聚簇索引就是以主键创建的索引
  5. 非聚簇索引就是以非主键创建的索引
  6. 聚簇索引在叶子节点存储的是表中数据,非聚簇存的是主键和索引列
  7. 非聚簇查询时,拿到主键再去查找想要的数据(回表)
    基本概念
    首先我们要知道数据库是如何存储数据的
    在这里插入图片描述
    上面的图片代表一页 ;
    每个数据页组成一个双向链表 ;
    而每个数据页中的记录又组成一个单向链表 ;
    其中每一页都会根据主键生成一个页目录,可利用二分法快速定位 ;
    以其他列做搜索条件时从最小记录开始依次遍历,检索每一页,因此索引作用体现于此;
    索引的实现
    在这里插入图片描述
    时间复杂度: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)
    索引总结
    最左匹配原则
    尽量选择区分度高的列作为索引
    索引列不能参与计算
    尽可能扩展索引而不是新建索引
    单个多列组合索引和多个单列组合索引检索查询效果不同
    索引本身也是有代价的,消耗存储空间,降低增删改效率

猜你喜欢

转载自blog.csdn.net/qq_51959441/article/details/111518239