mysql索引的实现原理

1,mysql索引原理:


    hash:通过索引的计算定位到数据的存储的位置,进行一次I/O即可,效率非常高,但是是适合用于等值查询,范围查询索引是不起作用。
    B+bree:MySQL的b+tree不是b-tree,而是在b-tree上进行了优化,所有的data都放在了叶节点,目的是为了使根节点存储更多的索引key值,mysql默认每一节点层是存储16k的数据,假设:存储的主键索引是bigint类型,默认是8b大小,而存储子节点的地址是6b,总共14b。16kb/14b=1170,所以根节点可以存储1170个key,假设有三层的话,默认存储的数据1k的话,那么叶节点可以存储16个数据,1170*1170*16=两千一百多万,两千多万的数据只需要三次I/O就可以找到,而现在有个问题,如果我要范围查询怎么办?因为b+tree所有的data都是放在最后的叶节点上,每个叶节点都是根据索引的顺序存放的,并且每个叶节点跟叶节点是有相互引用的指针。所有范围查询可以快速找到,

2,问题:uuid和自增长id那个存储效率高?


    因为mysql的b+bree的data是根据索引的顺序存放的,如果是自增长id的话,每次插入数据直接插入尾部就可以了,效率很高,而如果是uuid的话,因为uuid是一段字符串,当插入表中时,会根据字符串排序,判断该插入b+bree的哪个位置,这个位置也是不确定的,但要如果插入的叶节点的数据已经存储满了,这时候会出现b+tree分裂的情况。b+bree重排问题,所以效率非常低。

3,表级别的存储引擎myisam和innodb的b+tree区别

     MyISAM索引文件和数据文件是分离的,索引文件仅保存数据记录的地址。而在InnoDB中,InnoDB的数据文件本身就是索引文件。所以InnoDB表必须有一个主键,如果没有创建主键的话,mysql会默认帮你创建一个主键,而它的表数据文件本身就是按B+Tree组织的一个索引结构,这棵树的叶节点data域保存了完整的数据,也就是主键对应的一行的记录,myisam是“非聚集”索引,InnoDB是聚集索引。

 

myisam

 
    

innodb:

                   

图片有引用:https://www.cnblogs.com/olinux/p/5217186.html

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值