Mysql(一) 索引底层数据结构

Mysql(一) 索引底层数据结构

先了解一下索引常用的数据结构

http://www.rmboot.com/

二叉搜索树

优点:能够快速插入二分查找,时间复杂度是 O(logn)

缺点:没有平衡能力,最差情况下可能会成单只树,这时候查找的时间复杂度是 O(n)

请添加图片描述

红黑树

特点:是二叉平衡搜索树。红黑树能够以O(log2 n)的时间复杂度进行搜索、插入、删除操作

请添加图片描述

B树

特点:查找树,每个节点节点可以有多个子树,中间节点和叶子节点的数据不会重复

请添加图片描述

B+树

特点:查找树,每个节点节点可以有多个子树,叶子节点存储了全部数据,和中间节点的数据会有重复

请添加图片描述

索引

了解下数据结构之后,我们再来思考以下问题

  • 什么是索引?
  • mysql为什么需要索引?它的数据是怎么存储的?
  • 为什么采用B+树作为索引的数据结构?

简单来说,索引就是一种能够帮我们快速查找数据的数据结构,既然要快速查找,数据肯定要有序的存储和维护。

现在有一张表,如果没有索引的情况下,我想查找id为6的数据,就需要遍历整张表才能拿到,但是如果对id建立索引,将每行数据作为一个节点存储在以上的数据结构中,那么使用二分查找就很快能找到对应的数据。

请添加图片描述

mysql的数据是存储在磁盘上的,如果我们要去查找数据,就需要用到磁盘IO,如果树的深度很大的话,每次IO消耗的时间是比较难受的,所以二叉树不适合作为索引的数据结构。

innoDB存储引擎中数据是按照页存储的,页的大小默认是16kb,可以把一页作为树的一个节点。

B树会在中间节点存储一行的全部数据,如果行的数据过多,就会导致每页存储的索引数据就会变少,树的深度也会响应增加,导致多余的磁盘IO

b+树的优点:B+树的每个节点可以表示的信息更多,充分利用数据页存储索引数据,可以减少磁盘 IO 的次数,从而提升查找速度,行数据全部存放在叶子节点中,而叶子节点中有一个指针指向一下个叶子节点(双向指针)。这样可以提高区间访问的性能(范围查询)。

聚簇索引和非聚簇索引

聚簇索引就是按照每张表的主键构造一颗B+树,同时叶子节点中存放的就是整张表的行记录数据,也将聚集索引的叶子节点称为数据页。Innodb通过主键聚集数据,如果没有定义主键,innodb会选择非空的唯一索引代替。如果没有这样的索引,innodb会隐式的定义一个主键来作为聚簇索引。

非聚簇索引就是相对聚簇索引而言的,这种索引的树叶子节点不存储数据存储的是数据行地址,也就是说我们根据索引查找到数据行的位置再取磁盘查找数据,这个就有点类型一本树的目录,比如我们要找第三章第一节,那我们先再这个目录里面找,找到对于的页码后再去对应的页码 。

最左前缀原则

树的目录,比如我们要找第三章第一节,那我们先再这个目录里面找,找到对于的页码后再去对应的页码 。

最左前缀原则

因为索引是排好序的,当我们创建联合索引,或者使用 like的‘…%.’的时候,可以进行从左往右匹配。特别注意的是,当我们创建联合索引,a,b,c 三个字段。如果只使用b,c是不能走索引的,因为左边的值是模糊的,是不能进行匹配

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值