【无标题】

Mysql数据索引

经历的路线
全部遍历→Hash→二叉树→平衡二叉树→B-Tree→B+Tree

Hash:
一次定位,将索引进行hash计算,获得数据的地址,复杂度为O(1),1次磁盘IO
缺点:
范围查询时,如where id>6,仍需多次磁盘IO

二叉树:
优点:
父节点大于左子节点,小于右子节点,其查找效率为log2n
缺点:
当插入的节点一直大于之前的节点,会呈线性,复杂度为n

红黑树:
https://www.cnblogs.com/skywang12345/p/3624343.html
有左旋与右旋的特性
缺点:
红黑树适合于内存IO,而mysql索引数据都需要磁盘IO,使用红黑树效率低下,当数据插入太多时,使得红黑树深度过大,查询效率低下

BTree:
相对于红黑树,控制了树的深度,叶节点的深度都一样,采用大节点包含几个小节点的形式,小节点的个数由度来确定,一般度为4,当大节点超过了4个小节点,会取中间节点晋升为父节点,以此类推。一个大节点有四个小节点,每个小节点还含有data数据。

当查询某一个数据时,会进行一次磁盘IO获得大节点(大节点含4个小节点),加载进内存,再通过随机访问,直接索引到某一个小节点,获得数据,如果不匹配,才再进行一次磁盘IO,往第二层找大节点,以此类推。

度不是越大越好,假如所有小节点存入一个大节点,那一次磁盘IO可能会撑爆内存。
其次,内存与磁盘的交互是以页为单位,一页大小为4kb,即每一次磁盘IO最大的读取数据量是4k,如果节点过大,会导致多次进行磁盘IO,效率低下

B+Tree(innodb):
数据只存储在叶子节点,父节点及祖父节点都存储的是索引值,即每个节点可以存储更多的度,查询效率更快。
其次,叶子节点数据有横向指针,适合范围查询
innodb默认使用id主键索引,非主键索引如name,字符串索引,使用ascii进行比较大小

联合索引,多key索引存储
(name,date)先比较name
按B+tree进行查询,先通过ascii进行比较name大小,name一样,比较日期,在日期前选左边的指针再往下,反之。name最好不一样。

索引最前缀原理,联合索引(a,b,c)先比较a,再比较b,再比较c
where a=“adsa” and c=“asd”,直走a索引,不走c

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值