首页 > 数据库 >Mysql中的B+tree索引

Mysql中的B+tree索引

时间:2022-12-09 17:23:22浏览次数:42  
标签:Tree tree 索引 查找 键值 key Mysql 主键

BTree意思是多路平衡查找树,它是一种数据结构。MySQL的InnoDB和MyISAM存储引擎,都是使用它来存储索引。BTree可细分为B-Tree和B+Tree,B+Tree是B-Tree的升级版。MySQL的InnoDB和MyISAM存储引擎使用的是B+Tree

一 B-Tree

先来了解一下B-Tree,学名:多路平衡查找树,是为磁盘等外存储设备设计的一种平衡查找树,

为了描述B-Tree,首先定义一条记录为一个二元组[key, data] ,key为记录的键值,对应表中的主键值,data为一行记录中除主键外的数据。对于不同的记录,key值互不相同。如下图中的紫色部分就是key,橙色部分就是一行数据,绿色部分就是指针。

 

 对于B-Tree的查找,从图中可以看到,单个查找应该还可以,但是如果做范围查找的话,存在回旋查询的问题。同样order by排序的时候效率也很低,因为要把树上的数据手动排序一遍

二 B+Tree

 

B+Tree的数据都是保存在叶子节点,非叶子节点只存储key,不存储data,并且所有的叶子节点是一个链表结构,这样有利于范围查找。

三 聚簇索引于非聚簇索引

聚簇索引:将数据与索引放到了一块,索引的叶子节点保存了行数据

非聚簇索引:将数据分开存储,索引结构的叶子节点指向了数据对应的位置

通常,主键都是聚簇索引,我们根据实际情况自行添加的索引都是辅助索引,辅助索引就是一个为了需找主键索引的二级索引,先得找到主键索引再通过主键索引找数据(这就是所谓的回表)

聚簇索引的优点是对于主键的排序查找和范围查找速度非常快,缺点也很明显:1插入速度眼中依赖于插入顺序,按照主键的顺序插入是最快的方式,否则会出现页分裂,严重影响性能。因此,对于Innodb表,我们都会定义一个自增的ID列作为主键。2 更新主键的代价很高,因为将会导致被更新的行移动,一次,一般定义主键不可更新。3 二级索引访问需要两次索引查找,第一次找到主键值,第二次根据主键值找到行数据。

 

标签:Tree,tree,索引,查找,键值,key,Mysql,主键
From: https://www.cnblogs.com/zhaoblog/p/16969503.html

相关文章

  • ON DUPLICATE KEY UPDATE 导致mysql自增主键ID跳跃增长
    一.问题点:1.如果mysql表只是设置了联合主键且不包含自增的id,则使用ONDUPLICATEKEYUPDATE不会有问题2.如果mysql表设置了自增主键id,则使用ONDUPLICATEKEYUP......
  • mysql数据库为什么不建议select * from操作
    为什么select*from不是好的选择?在这里只是针对innodb数据库引擎来说明。我每次看到select*fromtableName时,我都觉得有没有必要?取出全部的列会让优化器无法完成索引覆盖......
  • 静态配置、request对象方法,pycharm连接mysql,django连接mysql,django ORM
    目录静态文件配置静态文件相关配置form表单request表单pycharm连接数据库django连接数据库ORM简介ORM基本操作ORM基本语句静态文件配置1.编写一个用户登录页面2.静态文......
  • 部门mysql操作
     usetest_db;--删除表droptableifexistst1_profit;droptableifexistst1_salgrade;droptableifexistst1_emp;droptableifexistst1_dept;--......
  • re_mysql_20221209
    --navicatSHOWTABLES;DESCtb_user;SHOWCREATETABLEtb_user;/*CREATETABLE`tb_user`(`id`int(11)DEFAULTNULLCOMMENT'编号',`name`varchar(50......
  • MYSQL 1 DAY
    目录MySQL1、sql、DB、DBMS分别是什么,他们之间的关系?2、什么是表?3、学习MySQL主要还是学习通用的SQL语句,那么SQL语句包括增删改查,SQL语句怎么分类呢?4、导入数据(后期大家练......
  • 修改mysql的root密码
    方法1:用SETPASSWORD命令首先登录MySQL。格式:mysql>setpasswordfor用户名@localhost=password('新密码');例子:mysql>setpasswordforroot@localhost=passwo......
  • mysql事务
    事务事务是一个最小的执行单元。通常一个事务对应一个完整的业务,多个操作同时进行,要么同时成功,要么同时失败,就是事务。一个完整的业务需要批量的DML(数据操纵语言,指数据库......
  • 框架第二课---静态文件配置,request对象方法,pycharm连接MySQL,django连接MySQL,django模
    昨日内容回顾手写web框架1.socket服务端2.http协议3.网址后缀wsgiref模块1.封装socket代码2.处理http相关数据代码封装优化1.函数2.对应关系3.文件、目......
  • Django、连接mysql、模型
    目录今日内容概要今日内容详细静态文件配置静态文件相关配置form表单request对象pycharm连接数据库django连接数据库ORM简介ORM基本操作ORM基本语句今日内容概要静态文......