首页 > 数据库 >mysql-B-Tree和B+Tree、回表

mysql-B-Tree和B+Tree、回表

时间:2023-04-22 12:58:16浏览次数:36  
标签:叶子 结点 Tree 回表 索引 mysql 主键 指针

image

B-Tree和B+Tree

前面是 B-Tree,后面是 B+Tree,两者的区别在于:
1.B-Tree所有节点都可以带指针,B+Tree只有叶子结点才可以带指针(叶子结点就是末尾的节点)
2.B-Tree中叶子结点没有指针连在一起,B+Tree中所有叶子结点通过指针连在一起
3.B-Tree可能在非叶子节点就拿到指向记录的指针,B+Tree需要在叶子节点才能拿到指向记录的指针
在 InnoDB 存储引擎中,B+Tree 的高度一般为 2-4 层,这就可以满足千万级的数据的存储

索引的分类

索引的分类有两个大类:主键索引和非主键索引
主键索引也就是聚簇索引,非主键索引包括普通索引、唯一索引、联合索引
主键索引和非主键索引使用的数据结构都是B+Tree,唯一的区别在于B+Tree存储的数据不同:
主键索引的叶子结点存储的是一行完整的数据,非主键索引的叶子结点存储的是主键值

所以当我们查询的时候:
如果我们是通过主键索引查找数据:select * from User where id = 100,此时只需要搜素主键索引的B+Tree,即可拿到数据
如果我们通过非主键字段查找数据:select * from User where name = 'max',那么需要先搜索非主键索引的B+Tree,拿到索引,然后再搜索主键索引的B+Tree,就可以获得数据

当我们用第二种方式查数据,一共查找了两次B+Tree,第一次是通过非主键索引找到主键,第二次是通过主键索引拿到数据,这个过程叫回表

从上面的分析中我们也能看出,通过非主键索引查询要扫描两棵 B+Tree,而通过主键索引查询只需要扫描一棵 B+Tree,所以如果条件允许,还是建议在查询中优先选择通过主键索引进行搜索。

标签:叶子,结点,Tree,回表,索引,mysql,主键,指针
From: https://www.cnblogs.com/ERROR404Notfound/p/17342786.html

相关文章

  • Mysql分布式锁的简单实现
    在做多线程操作数据库时避免不了的会遇到线程之间争抢同一条记录的问题,在mysql里可以实现分布式锁解决线程的反复调用问题。具体方法是利用数据库的唯一约束,设置一个比如状态的列来判断此记录是否正在被线程处理,可以默认值为0,表示未被处理,当值变为1时表示正在处理,值为2时......
  • MySQL 主键自增也有坑?
    在上篇文章中,松哥和小伙伴们分享了MySQL的聚簇索引,也顺便和小伙伴们分析了为什么在MySQL中主键不应该使用随机字符串。但是主键不用随机字符串用什么?主键自增?主键自增就是最佳方案吗?有没有其他坑?今天我们就来讨论下这个话题。1.为什么不用UUID经过上篇文章的介绍,我们知道在M......
  • mysql学习笔记2023年3月10日
    navicat 用法 ①创建数据库  ②创建数据表 外键  ③新建查询  ④转储SQL文件(执行的就是mysqldump命令) ⑤执行SQL文件前,需要先创建数据库临时表 (select*fromtb1)asB;  临时表表名为B select sidfromB; ......
  • 「独家解析」ShardingSphere分库分表技术实践,助力MySQL性能提升
    ApacheShardingSphere是一个开源的分布式数据库中间件解决方案组成的生态圈。它由三个产品组成:JDBC、Proxy和Sidecar。这些产品相互独立,但可以混合部署和配合使用,以提供标准化的数据分片、分布式事务和数据库治理功能。JDBC是ShardingSphere的基础组件,提供数据分片和读写分......
  • docker mysql 错误跟innodb有关
     错误截图 dockerps-a查看所有容器  容器开启失败,进入也失败 原因两个数据的文件冲突了,将你需要启动的那个数据库里面的这个干掉(即删除这两个文件)解决方式:备份(或者移除)两个文件ib_logfile0ib_logfile1 查找文件所在目录find/-nameib_logfile0......
  • mysql练习题1
    2、查询“生物”课程比“物理”课程成绩高的所有学生的学号;SELECTC.student_id,C.SHENGWU,D.WULIFROM(SELECTA.student_id,A.numberASSHENGWUFROMsockeALEFTJOINcorseBONA.corse_id=B.cidWHEREB.cname='生物')ASCLEFTJOIN(SELECTsocke.stud......
  • springboot定时同步数据,从sqlserver到mysql
    https://www.cnblogs.com/SjhCode/p/sqlserverToMysql.html定时同步数据,从sqlserver到mysql 注意事项:一.primary:master #设置默认的数据源或者数据源组,默认值即为master二.@Scheduled()和 @DS("slave_1")注解 步骤:1.在原先运行的程序外,新建多加一个springboot程序......
  • mysql-json类型字段多值并查
    mysql8.0.17版本支持json索引.官方文档:https://dev.mysql.com/doc/refman/8.0/en/json.html规则版本是否支持5.7.8版本:支持json类型字段8.0.17版本:支持json类型字段多列索引环境是否支持当前环境中使用的是gorm负责mysql的交互。支持原生sql操作,所以go......
  • mysql8主从节点搭建
    设置主从前先创建作为同步数据的用户,可直接在Navicat中创建并对需同步的库授权。注意创建用户的密码插件plugin要保持一致,MySQL8.0设为mysql_native_password,此项可在Navicat直接设置。以192.168.1.1从和192.168.1.2主1、在主节点修改配置文件/etc/my.cnf添加 server......
  • 关于 mysql 加了 limit 反而变慢的问题?
    SELECT*FROMpre_forum_postWHEREtid=6584344AND`inv`='0'AND`uid`='6547981'ORDERBYdatelineDESClimit4;上面一条正常执行需要16-20秒.SELECT*FROMpre_forum_postWHEREtid=6584344AND`inv`='0'AND`uid`='6547981'O......