【Mysql】索引原理

一、索引的分类

    普通索引index
    唯一索引:主键索引primary key、唯一索引unique
    联合索引:联合主键索引primary key(id, name)、联合唯一索引unique(id, name)、联合普通索引index(id, name)

二、MyISAM索引的实现原理

    通常使用B+树来实现的索引,示例如下:
在这里插入图片描述
    1)非叶子节点仅存储索引,不存储任何真实的数据值,所有的数据值,均存储于叶子节点中,且每个叶子节点都有一个指针指向下一个叶子节点
    2)图中每一个大方框代表一个磁盘块,每个磁盘块中数据项的数量越多,一次检索能够缩小的范围越多。而磁盘块的大小一定,为此数据项的size越小,每个磁盘块中存储的数据量越多(这就是为何索引列字段size应该尽量小)。
    3)树的高度越小,越快到达叶子节点,搜索越快

    2.2.1、复合索引

在这里插入图片描述
    复合索引(name,id),以name建立B+树,并将索引id存放于叶子节点中

2.3、InnoDB索引的实现原理

    基于B+树实现,但是与MyISAM有所不同。示例如下:
在这里插入图片描述
    1)InnoDB的主键索引的叶子节点中,存储的是记录的所有数据列,也就是说数据文件本身就是索引文件。MyISAM的叶子节点中存储的是索引列,并且存储记录的地址,索引文件和数据文件是分开的。
    2)InnoDB的普通索引(非主键索引)的叶子节点中,存储的是索引列,以及对应的主键。使用普通索引时,先找到主键,再去主键索引中取信息。
    思考1:为何InnoDB的非主键索引中存储的是主键索引,而不是和MyISAM一样存储记录的地址?InnoDB的非主键索引为何要采用这种二次查找的方式?
    InnoDB在设计之初就考虑到数据的修改问题,每次修改,如果采用MyISAM的方式,就需要更新数据表中所有的索引中该记录的地址信息。而采用主键存储记录的方式,修改记录只需要修改主键的相关叶子节点即可,不用再去维护普通索引的信息。所以MyISAM适合查找信息,而InnoDB适合修改信息。

2.4、索引相关优化

    为什么使用LIKE %a会导致索引失效?
    如果使用%a这种前置模糊匹配的方式,每一条数据信息,不管前面是什么,后面都有很能和a后缀匹配,这个时候只能全表匹配,以防漏掉某条数据。

    为何建立索引的数据列,其数据大小需要尽量小一些?
    结合上面的索引示意图,每一个非叶子节点都是一个磁盘块,一个磁盘块中的索引节点越多:a、索引树的高度会越小,搜索也会越快到达叶子节点;b、每经过一次搜索能够锁定的范围也越小。而磁盘块的大小是一定的,故当每个数据的大小越小,磁盘块能够存储的索引节点越多。

如有不当之处,欢迎指正不胜感激

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值