为什么MySQL索引结构是B+tree ?

简介: MySQL采用B+树作为索引结构,因其非叶子节点仅存键值与指针,可存储更多键,降低树高,提升查询效率。数据集中于叶子节点并形成双向链表,支持高效稳定的范围查询。通常树高为2-3层,即可容纳上千万数据,显著优于二叉树或B树。
  • 必答内容:

其实这个问题,我们可以做一个假设啊。

  • 假设索引结构是二叉搜索树、平衡二叉树 或 红黑树等,其实本质都是二叉树,一个节点下最多只能有两个子节点,如果这张表要存储的数据量比较大,二叉树的层级将会非常深,检索效率会很低。
  • 而如果索引结构是Btree,在B树中,非叶子节点和叶子节点既要要存储key和指针,还要存放数据,而InnoDB的物理存储结构中,一页(Page)的大小是固定的,就是16KB。 那这一页中能够存储的key的数量并不多,就会造成大数据量情况下,树的层级较深,检索速度慢。 还有一个问题,就是由于 非叶子节点和叶子节点既要要存储key,还要存放数据,查找效率并不稳定。 (有些数据,只需要一次查找,有些数据,可能需要五六次,有些...)

所以,在MySQL数据库中才使用了B+tree作为索引的数据结构。 主要有以下优势:

  • 在B+tree中,非叶子节点并不存放数据,只存放key和指针,所以一页(Page)中能够容纳的key将更多,相同数据量的情况下,树的层级要浅的多,检索效率高。
  • 所有的数据都存储在B+tree的叶子节点中,也就意味着无论什么数据,都需要找到叶子节点才能查询到对应的数据,检索效率更加稳定。
  • 第三是B+树数据都存储在B+tree的叶子节点,并形成了一个双向链表,便于区间范围查询。
  • 可能继续发问的问题:

那MySQL的B+tree的索引结构,树的高度一般是多高呢?

嗯,这个高度其实是可以计算出来的,一般高度在2-3层,如果高度为3,基本上就可以容纳一两千万的数据了。如何计算呢?

  • 我们的索引是在页(Page)中存储的,而一个页的大小模式为(16KB)。
  • 对于非叶子节点来说,页中存储的除了具体的key之外,还有一个就是指针 。(假设主键为bigint占8个字节,指针占6个字节)
  • 那么我们就可以大概计算出一页中可以存储的key数量为:16 * 1024 / 14 = 1170 。也就意味着一个页(Page)中约可以存1170个key
  • 假设一行数据的大小为1KB,一页可以存16条数据。那两层的B+tree可以容纳:1170*16=18720条数据。
  • 那三层的B+tree可以容纳:1170 * 1170 * 16 = 21902400 条数据。
  • 帮助理解的图示:

3、索引优化

相关文章
|
缓存 资源调度 内存技术
yarn报错文件名、目录名或卷标语法不正确
yarn报错文件名、目录名或卷标语法不正确
831 0
|
4月前
|
存储 关系型数据库 索引
聚簇索引及其优缺点
聚簇索引是一种数据存储方式,InnoDB通过主键构建B+树组织数据,叶子节点即数据页。若无主键,则选非空唯一索引或隐式创建主键。辅助索引(二级索引)需两次查找:先查主键值,再查数据行。优点是查询快,尤其主键排序与范围查询;缺点是插入依赖顺序,更新主键代价高,且易引发页分裂。
|
存储 关系型数据库 MySQL
MySQL高级篇——覆盖索引、前缀索引、索引下推、SQL优化、主键设计
覆盖索引、前缀索引、索引下推、SQL优化、EXISTS 和 IN 的区分、建议COUNT(*)或COUNT(1)、建议SELECT(字段)而不是SELECT(*)、LIMIT 1 对优化的影响、多使用COMMIT、主键设计、自增主键的缺点、淘宝订单号的主键设计、MySQL 8.0改造UUID为有序
MySQL高级篇——覆盖索引、前缀索引、索引下推、SQL优化、主键设计
|
存储 关系型数据库 MySQL
MySQL 为什么使用 B+ 树作为索引结构?
MySQL 为什么使用 B+ 树作为索引结构?
586 2
|
7月前
|
SQL 存储 关系型数据库
MySQL索引原理:B+树为什么是数据库的首选
MySQL为何选择B+树作为索引结构?本文深入解析B+树的底层机制,通过对比哈希表、二叉树、B树等数据结构,揭示其在磁盘I/O效率、范围查询和数据稳定性方面的优势。内容涵盖B+树的核心原理、在MySQL中的实现、性能优化策略及实际业务场景应用,帮助你深入理解索引背后的运作原理,从而优化数据库查询性能。
|
SQL 运维 关系型数据库
MySQL Binlog 日志查看方法及查看内容解析
本文介绍了 MySQL 的 Binlog(二进制日志)功能及其使用方法。Binlog 记录了数据库的所有数据变更操作,如 INSERT、UPDATE 和 DELETE,对数据恢复、主从复制和审计至关重要。文章详细说明了如何开启 Binlog 功能、查看当前日志文件及内容,并解析了常见的事件类型,包括 Format_desc、Query、Table_map、Write_rows、Update_rows 和 Delete_rows 等,帮助用户掌握数据库变化历史,提升维护和排障能力。
|
消息中间件 JSON Java
Spring Boot、Spring Cloud与Spring Cloud Alibaba版本对应关系
Spring Boot、Spring Cloud与Spring Cloud Alibaba版本对应关系
34809 1
|
JSON 缓存 小程序
微信小程序组件封装与复用:提升开发效率
本文深入探讨了微信小程序的组件封装与复用,涵盖组件的意义、创建步骤、属性与事件处理,并通过自定义弹窗组件的案例详细说明。组件封装能提高代码复用性、开发效率和可维护性,确保UI一致性。掌握这些技能有助于构建更高质量的小程序。
|
SQL 数据采集 数据可视化
Pandas 数据结构 - DataFrame
10月更文挑战第26天
914 2
Pandas 数据结构 - DataFrame