问答系列:关于MySQL的底层存储逻辑——B+树和索引

MySQL索引的底层数据结构是B+树数据结构

  1. B+树是一个多路平衡树,特点正如名字所示:“多路”:B+树的每个节点可以分出多条支路(支路数量上限取决于内存一页数据能存放多少个节点),“平衡”:树的各个分支深度都一样。
  2. B+树的所有叶子节点构成一个双向链表,便于进行范围查找
  3. B+树中只有叶子节点存储数据(就是数据库中的记录),非叶子节点只有索引数据。

❗:B树 = = = B-树,称为多路搜索树,中间是连字符,不是减号。

为什么不用二叉查找树,而用“多路”查找树?

  二叉树的特性造成根节点距离叶子节点的路径太长,增加了查找次数。

为什么B+树只留叶子节点存储数据呢?

  这里涉及到计算机中的IO操作,计算机IO一次只能拿一数据页的数据,如果每一个节点都有数据,那么一次IO可供搜索的节点数会变得很少,IO操作是比较耗时的,因此一页内存存储多个节点可以有效提高搜索效率。

MySQL利用索引加快查找速度,那么索引数是不是越多越好?

  建立索引就是给索引字段建立了一个索引结构(实际上,索引也是一张表,索引文件会额外占用磁盘空间),当插入一条数据时,那么这条数据中的被索引字段也需要建立到索引结构中,因此就需要调整索引结构。当索引数量较多时,数据更新会明显慢很多。

什么是索引和联合索引呢?

  索引可以大大提高MySQL的检索速度,创建索引时,你需要确保该索引是应用在 SQL 查询语句的条件(一般作为 WHERE 子句的条件)。
  对数据表的多个字段建立索引称为联合索引,建议索引字段最多不要越过3个,超过3个,应重新设计表。当两个字段单独查询返回行较多,同时查返回行较少,联合索引更高效。

# 建立单个索引
create index indexName on tableName (columnName)
# 建立联合索引
create index indexName on  tableName(column1,column2,...,columnN)

如果建立的联合索引是A、B、C三个字段,查询条件是A、B,那么这个索引还有效果吗?

MySQL建立联合索引时会遵守最左前缀匹配原则,相当于根据查询条件精确匹配索引的左边连续一列或几列,则构建对应列的组合索引树,在检索数据时也从联合索引的最左边开始匹配。
例如:

create index indexName on  tableName(a,b,c)

a,b 以及 a,b,c 均构成联合索引,但 b 或 b,c 不构成联合索引,a,b,c,d 同样不构成联合索引,因此需要哪个字段就查询哪个字段,避免出现未建立索引的字段。

索引在哪些类型的查询中会失效?

1、 不等号:在使用 != 或者 <> 这样的会失效。
2、不包含不存在:在使用 not innot exists 这样的会失效。
3、null判断is null,不为空 is not null 这样的会失效。
4、不等号:在使用 <><=>= 这些的时候,mysql优化器会根据索引比例、表的数据量大小等因素来决定走不走索引。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Anonymity~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值