MySQL为什么要选B+数作为底层的数据结构

一: MySQL为什么要选B+数作为底层的数据结构

推荐的算法演示平台

  • MySQL的底层算法有B数、红黑树、hash、B+树,为什么就选择了B+树作为数据库的底层物理结构
  • 二叉树的特点是左节点小于根节点、根节点小于右节点
  • B树由于存在特殊情况,如左节点为空,节点全在右节点上,这样导致的结果会造成和没有索引一样,依次查找,效率很低,同时也会造成树的深度很深,IO次数太多导致查询效率很低。
    B树结构
  • 红黑树由于存在树的深度问题导致查数据IO消耗很大,索引降低了性能。

红黑树

  • Hash索引把数据以hash形式组织起来,因此查找某一条记录的时候,速度非常快。同时.hash算法的索引有个缺点,因为它不是按照大小排序的。所以,它无法按照范围进行查找。
    hash结构
  • B+树结构就对这些情况进行了优化
    B树的深度设定为三层,每一层的大小为16K,而每个索引和索引指针对应的大小为8kb和6kb,这样索引和索引指针加起来的大小就为14kb,一层就可以存161024/14 = 1170,第一层和第二层全部存的是索引和索引指针,第三层存的就是指针和数据,每个指针和数据所占的大小为1k,这样第二次的一个索引对应的第三层索引最多就为16个,这样索引的数量最多就为11701170*16 = 21902400,也就是两千一百多万,这也是为什么数据库的性能瓶颈为两千多万。
    B+树
    优势:
    1:避免了树的深度,这样就可以减少IO的消耗,可以很快的找到对应的数据
    2:叶子节点的左右索引存在指针,这样对于范围查询的效率有了很大的提升

二:聚簇索引和非聚簇索引的区别

InnoDB主索引就是聚簇索引,而MyISAM主索引就是非聚簇索引

  • MyISAM数据库引擎:
    MyISAM数据库存储引擎
    MyISAM数据库引擎的数据和索引是分开存放。
    地址指向我们的数据条。这就实现了我们的索引与数据分开的非聚集索引。
    这里有个特点,每个叶子结点都可以通过指针相连,这就支持我们进行顺序打印了。
  • InnoDB数据库引擎
    InnoDB数据库引擎的索引和数据是存放在一起的。
    InnoDB数据库引擎
  • 不同数据库存储引擎存储格式
    MyISAM存储格式:
    MyISAM存储格式
    .frm文件存的是表的数据结构
    .MYI文件存的是索引
    .MYD文件存的是数据

InnoDB存储格式:
InnoDB存储格式
.frm文件存的是表的数据结构
.ibd文件存的是表的索引和数据

三:主键索引和普通索引的区别

在 MySQL 中, 索引是在存储引擎层实现的, 所以并没有统⼀的索引标准, 由于 InnoDB 存储引擎在 MySQL数据库中使⽤最为⼴泛, 下⾯以 InnoDB 为例来分析⼀下其中的索引模型.在 InnoDB 中, 表都是根据主键顺序以索引的形式存放的, InnoDB 使⽤了 B+ 树索引模型,所以数据都是存储在 B+ 树中的, 如图所示:
主键索引和普通索引的区别
从图中可以看出, 根据叶子节点内容不同,索引类型分为主键索引和非主键索引.
主键索引也被称为聚簇索引,叶子节点存放的是整行数据; 而非主键索引被称为二级索引,叶子节点存放的是主键的值.
如果根据主键查询, 只需要搜索ID这颗B+树
而如果通过非主键索引查询, 需要先搜索k索引树, 找到对应的主键, 然后再到ID索引树搜索一次, 这个过程叫做回表.
总结, 非主键索引的查询需要多扫描一颗索引树, 效率相对更低.

四:联合索引的底层是如何实现的

  • 表结构
CREATE TABLE `city` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '城市编号',
  `province_id` int(10) unsigned NOT NULL COMMENT '省份编号',
  `city_name` varchar(25) DEFAULT NULL COMMENT '城市名称',
  `description` varchar(25) DEFAULT NULL COMMENT '描述',
  PRIMARY KEY (`id`),
  KEY `index_pro_ci_de` (`province_id`,`city_name`,`description`) USING BTREE COMMENT '联合索引'
) ENGINE=InnoDB AUTO_INCREMENT=1850386 DEFAULT CHARSET=utf8;
12345678

联合索引是存在索引顺序的
联合索引
联合索引的顺序绝对了索引的优先级,如姓和名,都是先根据姓去找到对应的姓,然后根据名去找到对应的人,这样联合索引才有效,如果只有名而没有性,那么性可能是没有排好序的,这样索引就失去了意义,这样就无法利用索引从而导致联合索引失效,这也是为什么联合索引构建的时候一定要注意顺序性。

五:MySQL的主键为什么建议为整型而且要自增

  • MySQL的主键为什么建议为整型
    主键作为整型的好处有:
    1:整型所占用的内存少,所以可以存放的索引数量更多。
    2:整型比较起大小来比UUID的效率更快。
    主键整型自增的好处:
    如果用UUID作为主键,那么就存在B+树的分裂重整。
    用整型自增就不存在这个问题,直接每次在B+树的末尾添加即可。
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
B树和B+树都是用于组织和管理据的树形数据结构,但它们在结构特性和用途上有所不同。以下是它们之间的主要区别: B树: 1. B树是一种自平衡的树,这意味着它能在保持据有序的同时,提供有效的搜索、插入和删除操作。B树的每个内部节点可以保存多个关键字以及指向子树的链接。 2. B树只有一个根节点,而且除了叶子节点外,所有的节点都是关键字及其指针的列表。每个节点的大小都有限制,以保证树的高度不超过一定值,以提高搜索效率。 3. 由于B树的内部节点可能包含大量的关键字,因此插入和删除操作可能需要跨越多个节点。为了解决这个问题,B树允许分裂和合并操作,以保持树的平衡。 B+树: 1. B+树也是一种自平衡的树,但它与B树的主要区别在于叶子节点上。B树的叶子节点是混合的,可以包含关键字和指针,而B+树的叶子节点仅包含键值和指向相关记录的指针。 2. B+树的叶子节点之间通过共同的关键字建立索引,使得查询可以更高效地通过关键字定位到相应的叶子节点集合。这使得它特别适合用于磁盘上的存储和搜索。 3. 由于叶子节点只包含键值和指针,所以B+树的内部节点可以存储更多的键值,从而减少了搜索时需要访问的叶子节点量。这有助于提高搜索效率。 选择B+树作为InnoDB的底层数据结构的原因: InnoDB是MySQL数据库的核心存储引擎之一,它使用B+树作为其底层数据结构的主要原因有: 1. 高效搜索和查询:由于B+树的结构特性,它能够提供高效的搜索和查询操作。这对于需要频繁查询和搜索的大量据的系统来说非常重要。 2. 磁盘友好:由于B+树的叶子节点只包含键值和指针,它更适合在磁盘上进行存储和搜索。这使得InnoDB能够更好地利用磁盘I/O性能,从而提高查询性能。 3. 顺序访问:由于B+树的叶子节点之间通过共同的关键字建立索引,它支持顺序访问操作。这对于需要按特定顺序访问据的场景(如排序、分组等)非常有用。 4. 稳定性和可扩展性:由于B+树的结构稳定,且能够通过增加新的叶子节点来扩展存储容量,它适合于大规模据的存储和检索。 综上所述,B+树作为InnoDB的底层数据结构提供了高效的搜索、查询、顺序访问和可扩展性等优势,使其成为适合用于处理大量据的数据库存储引擎的理想选择。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值