B树与B+树与Mysql innodb的B+树和其相关索引

作者 : admin 本文共1534个字,预计阅读时间需要4分钟 发布时间: 2024-06-17 共1人阅读

文章目录

  • 前言
    • B树与B+树与Mysql innodb的B+树和其相关索引
      • 1. B树
      • 2. B+树
      • 3. Mysql上的Innodb 的B+树
      • 4. 基于 innodb的B+树说索引
      • 5. mysql中的数据类型转换需要注意哪些事项

前言

  如果您觉得有用的话,记得给博主点个赞,评论,收藏一键三连啊,写作不易啊^ _ ^。
  而且听说点赞的人每天的运气都不会太差,实在白嫖的话,那欢迎常来啊!!!


B树与B+树与Mysql innodb的B+树和其相关索引

1. B树

B树:一个节点有多个元素
具体有多少个元素根据Degree来设置的
如果Degree为3,那么B树最多三个分支,每个节点最多两个元素。

排序:节点的左边都是比它小的,节点的右边都是比它大的,节点内部的元素也是排了序的。

2. B+树

B+树:
一个节点有多个元素
排了序
叶子节点有指针
非叶子节点的元素都冗余了一份在叶子节点上面,
B+树上面存储的所有元素都在我们的叶子上面,而且叶子节点都是有指针链接并且是有序的。

3. Mysql上的Innodb 的B+树

Mysql上的Innodb 的B+树:
没有数据冗余,上面哪个B+树数据结构是单向的指针,而mysql上的B+树是双向的指针
数据存储特点:最下层的叶子节点上存储数据,也叫数据页,上面节点存储的是页,存储的是目录,也叫索引页。

注意的是两层的B+树性能最好,三层的次之,剩下的性能就不怎么好了,可能需要分库分表了,建议B+树最好是两层,B+树里面的元素在mysql里叫做页,一页的大小是16kb。

这些都是B+树,可以理解为B+树是B树的一个升级,mysql这个叫B+树,我们刚刚的示例也是B+树,这个就看个人理解了,可能别的中间件它B+树可能也不一样,但它也叫B+树。

4. 基于 innodb的B+树说索引

Mysql在插入的时候,以主键的值来进行排序,所以主键最好是递增的方式,这样的话,会降低排序的性能。

主键索引也叫聚族索引,它主要原理是在B+树最下面的叶子节点即数据页上直接查到对应的数据。

而其他索引,就是先查B+树上面的索引页,然后在找到对应的数据页,找到具体的值。

从数据页上从左到右依次查找就叫全表扫描

联合索引最左前缀原则和你的where条件里边的顺序无关。主要看的是联合索引最左边的字段,在where条件有没有加。

注意的是对于范围查查,并不是你加了索引,就一定会走索引,mysql会根据情况不同采取走索引或者走全表扫描,或者覆盖索引,因此对于范围查找,数据越精确越好,可以利用索引快速的查找。

Order by 什么时候会导致索引失效
示例:
表 t1(a字段,b字段,c字段)
select * from t1 order by a,b,c;
联合索引(a,b,c)

它有两种可能:
第一种,走全局扫描,额外排序(内存), 不需要回表

第二种,走索引,因为你排序的规则和联合索引排序的规则一样,不需要排序,但是需要回表。
因为回表的性能要比内存排序大很多,当数据量小的时候,第一种全局扫描就比较快,这时候就会走全局扫描。

select c from order by a,b,c;

因为你的select 是 c 字段,不是*,这时候你即不需要回表也不需要排序,因此这时候就会走索引。

所以我们开发过程中尽量不要使用*,可以减少回表的动作。

5. mysql中的数据类型转换需要注意哪些事项

当where条件后涉及到数据类型转换的时候,
比如:
Where huh = 1
其中huh为varcher类型
当mysql执行此语句的时候,它会首先将huh先转换成数字在进行对比,这样的话,会导致你的innodb之前存储的的索引页和你执行过程中转换的数字对应不上,所以不会走索引,而是走全局扫描,所以凡是对字段操作的都不会走索引,比如:
where hub +1=1 和对字段类型转换的也不会走索引

本站无任何商业行为
个人在线分享 » B树与B+树与Mysql innodb的B+树和其相关索引
E-->