当前位置: 首页 > article >正文

MySQL - 为什么InnoDB选择B+树索引?Change buffer?

为什么InnoDB选择B+树索引

  1. 性能需求和查询场景:InnoDB通常需要在各种查询场景下提供卓越的性能。B+树索引非常适合满足这些需求,尤其在支持范围查询和排序等复杂操作时表现出色。

  2. 磁盘和内存效率:将数据从磁盘加载到内存需要耗费大量时间,因此磁盘I/O效率至关重要。以下是更详细的考虑因素:

    • 哈希索引局限:虽然哈希索引可以提供O(1)复杂度的查询,但它无法很好地支持范围查询和排序,这可能导致必须进行全表扫描。
    • B树的局限:B树可以在非叶子节点存储数据,但在查询连续数据时可能引入更多的随机I/O。
    • B+树的优势:B+树的所有叶子节点都通过指针相互连接,减少了顺序遍历时可能出现的随机I/O。

普通索引和唯一索引的选择

	唯一索引无法利用"Change buffer"的优化机制。
	因此,从性能的角度出发,如果业务允许,建议优先考虑使用非唯一索引。
什么是"Change buffer"?

“Change buffer” 是 InnoDB 存储引擎中的一项重要性能优化机制,它主要用于减少磁盘 I/O 操作的次数,从而提高数据库的写入性能。具体来说,“Change buffer” 的主要作用如下:

  1. 延迟索引更新:当有写操作(如插入、更新、删除)需要修改B+树索引结构时,InnoDB不会立即将这些修改写入磁盘的索引页。相反,它将这些修改操作记录在"Change buffer" 中,同时在内存中维护一份待更新的索引树。
  2. 减少随机磁盘写入:通过将索引修改操作暂时保存在"Change buffer"中,InnoDB可以将随机的磁盘写入操作转换为更集中的顺序写入操作。这是因为多个索引修改操作可以在内存中聚合,并一次性写入磁盘,减少了随机I/O操作,提高了写入性能。
  3. 提高并发性能:由于修改操作首先被记录在"Change buffer"中,事务可以更快地提交,而不必等待磁盘 I/O 完成。这提高了数据库的并发性能,因为多个事务可以并行执行而不会相互阻塞。
  4. 在恢复时加速:在数据库崩溃后,InnoDB可以使用"Change buffer"来快速重放未写入磁盘的索引修改操作,从而缩短数据库恢复的时间。

需要注意的是,"Change buffer"适用于非唯一索引,因为唯一索引必须在插入新数据行时立即更新。这一机制有助于提高数据库的写入性能,特别是对于大量的插入、更新和删除操作,它可以显著减少随机磁盘写入的负担,从而改善数据库的性能和并发能力。

那主键索引、联合索引会利用吗?
  1. 主键索引:主键索引是表的主要索引,它通常不会利用"Change buffer"。主键索引的唯一性要求使得任何对主键的插入、更新或删除操作必须立即更新索引,以确保数据的一致性和唯一性。
  2. 联合索引:联合索引也不会受益于"Change buffer"。联合索引是指建立在多个列上的索引,与主键索引一样,它们也要求立即维护索引的一致性,因此不会使用"Change buffer"来延迟索引更新。

http://www.kler.cn/a/106636.html

相关文章:

  • 数字IC后端低功耗设计实现案例分享(3个power domain,2个voltage domain)
  • vue3:computed
  • 如何修改npm包
  • 二叉树遍历的非递归实现和复杂度分析
  • QT_CONFIG宏使用
  • Qt主线程把数据发给子线程,主线程会阻塞吗
  • Docker 入门
  • 计算机网络重点概念整理-第二章 物理层【期末复习|考研复习】
  • B链圆桌派 — 创新的去中心化存储网络 BNB GREENFIELD 主网上线
  • 音视频开发常见问题(五):视频黑屏
  • openlayers 地图组件封装
  • 为什么要做知识管理
  • 抖音上怎么挂小程序?制作小程序挂载抖音视频
  • buuctf_练[CSCCTF 2019 Qual]FlaskLight
  • Kubernetes技术与架构-存储 2
  • Kafka - 消息队列的两种模式
  • gitlab 通过变量连接自建K8S
  • 鸿鹄工程项目管理系统 Spring Cloud+Spring Boot+Mybatis+Vue+ElementUI+前后端分离构建工程项目管理系统项目背景
  • 计算机网络重点概念整理-第六章 应用层【期末复习|考研复习】
  • 【鸿蒙软件开发】ArkTS通用事件
  • Mac-postman存储文件目录
  • vue的双向绑定的原理,和angular的对比
  • 计算机毕业设计 基于SpringBoot高校竞赛管理系统的设计与实现 Javaweb项目 Java实战项目 前后端分离 文档报告 代码讲解 安装调试
  • 【C++进阶】set和map的基本使用(灰常详细)
  • Chapter1:C++概述
  • 三代自动驾驶系统及主流科技公司自动驾驶技术方案简介