热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Mysql中B+Tree索引结构、遍历次数、磁盘io次数分析

Mysql中B+Tree索引结构、遍历次数、磁盘io次数分析一.Mysql数据库常见存储引擎1.可以作为索引文件的数据结构:二叉树,红黑树,hash表,B-tree,B+tree,

Mysql中B+Tree索引结构、遍历次数、磁盘io次数分析

一.Mysql数据库常见存储引擎

1.可以作为索引文件的数据结构:
二叉树,红黑树,hash表,B-tree,B+tree,但是二叉树,红黑树受到树高问题限制,hash表无法进行索引排序无法进行查询,B-tree无法充分利用非叶子节点的存储能力,所以在mysql数据库中最常用的索引存储数据结果为B+tree;

2.索引文件组织结构:
聚簇索引:索引字段+全部其他表字段保存在一个文件中,索引树的叶子节点即表中全量数据;
非聚簇索引:索引字段和表中全量字段分两个文件进行保存,索引树的叶子节点中存储对应全量数值在磁盘上的地址;

3.mysql数据库中常用的存储引擎:
MyISAM:采用非聚簇索引,不支持行级锁,不支持事 务;数据结构如下图所示:
《Mysql中B+Tree索引结构、遍历次数、磁盘io次数分析》

innoDB:采用聚簇索引,支持行级锁,支持事务,MVCC机制等;数据结构如下图所示:
主键索引聚簇《Mysql中B+Tree索引结构、遍历次数、磁盘io次数分析》
辅助索引非聚簇(但在叶子节点中会保存主键索引树中的对应的值,便于回表使用)
《Mysql中B+Tree索引结构、遍历次数、磁盘io次数分析》

二.B+tree索引文件结构及索引树遍历情况
1.索引文件组织结构
非叶子节点不存储data,只存储索引(冗余),可以放更多b的索引
叶子节点包含所有索引字段
叶子节点用指针连接,提高区间访问的性能
如下图所示:
《Mysql中B+Tree索引结构、遍历次数、磁盘io次数分析》
在B+tree索引的表空间Tablespace 中具有以下几个概念:
• 段:一个索引2段:叶子节点Segment & 非叶子节点Segment;
• Extent(1MB):一个Extent(1M) 包含64个 Page(16k),一个Page里包含很多有序行数据 , InnoDB B-Tree 一个逻辑节点就分配一个物理Page;
• Page(16KB):B+tree中每个数据节点就是一个page

• Row:记录行

• Field:字段

2.MYISAM和innoDB索引树遍历过程
MYISAM存储引擎
MYISAM存储引擎中主键索引和辅助索引都都采用非聚簇形式,在磁盘中一共有三个文件进行数据存储分别为,数据数据定义文件,索引文件,数据文件;
执行数据查询时索引树的遍历流程为:
a.将磁盘索引文件的根节点的page加载到内存,进行二分查找定位到子节点的page,依次递归加载相应的page,找叶子节点data中磁盘地址;
b.根据data中的磁盘地址去数据文件中加载相应的数据到内存;

innoDB存储引擎
innoDB存储引擎的主键索引采用聚簇索引,辅助索引采用非聚簇;拥有一个数据定义文件和一个索引文件(索引+其+其它字段合并)
执行数据查询时索引树的遍历流程为:
主键索引: 确定定位条件, 找到根节点Page No, 根节点读到内存, 逐层向下查找, 读取叶子节点Page,通过 二分查找找到记录或未命中。
辅助索引:通过二级索引查出对应主键,拿主键回表查主键索引得到数据, 二级索引可筛选掉大量无效记录,提高效率( 回表就是通过辅助索引拿到主键id之后,要再去遍历聚集索引的B+树,这个过程就叫做回表。回表的操作更多的是随机io,随机io在性能上还是比较低)

全表扫描:直接读取叶节点头结点, 顺序扫描, 返回符合条件记录, 到最终节点结束

三.聚集索引和非聚集索引执行一次sql的io次数
磁盘io次数分析
(1) 数据量小的话,直接把索引放到内存中,内存的O(logn)消耗是远远低于磁盘io的,所以可以忽略不计
(2) 数据量大的话,采用索引结构,我们这部分先从二叉树说起,对于普通二叉树,第一个步骤是二分,每次判断都是一次半数的数量级检索。假如有100W的数据,大概的时间复杂度是:log2N=1000000即N=20的节点获取,也就是磁盘I/O复杂度最大为O(20),二分的时间复杂度是O(log2N)。
(3) 但是对于数据库来说,存储场景会更加复杂,二叉树的性能虽然好,但我们还是想要树的高度更低一些,存储的数据更多一些。因此mysql引入了B+树的概念。除了根节点之外,第二层级的数量得到了充分的扩展,相对于普通的二叉树,B+树的结构更加庞大又不失美感,假设非叶节点不同元素占用情况为:下一条记录指针占4Byte,id值8Byte,目标记录指针4Byte,那么一个4Kb的磁盘块将大致可以容纳250个下级指针,100万行目标记录(假设叶子节点也是只保存了id值,则一个非叶子节点下面也包括大概250个叶子节点)只需log250N=1000000即N=3的I/O次数,充分提升了每次节点I/O带来的检索效用,时间复杂度是O(lognN),这里的n是非叶子结点的个数。(PS:实际上innodb的数据页大小是16kb,这个n会更大,那么对应的,io次数也会更少)
(4) 在实际的查询中,IO次数可能会更小,因为有可能会把部分用到的索引读取到内存中,相对于磁盘IO来说,内存的io消耗可以忽略不计。一般来说B+Tree的高度一般都在2-4层,MySQL的InnoDB存储引擎在设计时是将根节点常驻内存的,也就是说查找某一键值的行记录时最多只需要1~3次磁盘I/O操作(根节点的那次不算磁盘I/O)。

多大的索引数据可以直接放到内存中
要参照自己的mysql设置,一般是innodb_buffer_pool_size的值,这个值默认是128M,具体的要根据机器的性能设置。


推荐阅读
  • 本文详细介绍了Java代码分层的基本概念和常见分层模式,特别是MVC模式。同时探讨了不同项目需求下的分层策略,帮助读者更好地理解和应用Java分层思想。 ... [详细]
  • H5技术实现经典游戏《贪吃蛇》
    本文将分享一个使用HTML5技术实现的经典小游戏——《贪吃蛇》。通过H5技术,我们将探讨如何构建这款游戏的两种主要玩法:积分闯关和无尽模式。 ... [详细]
  • 二维码的实现与应用
    本文介绍了二维码的基本概念、分类及其优缺点,并详细描述了如何使用Java编程语言结合第三方库(如ZXing和qrcode.jar)来实现二维码的生成与解析。 ... [详细]
  • 流处理中的计数挑战与解决方案
    本文探讨了在流处理中进行计数的各种技术和挑战,并基于作者在2016年圣何塞举行的Hadoop World大会上的演讲进行了深入分析。文章不仅介绍了传统批处理和Lambda架构的局限性,还详细探讨了流处理架构的优势及其在现代大数据应用中的重要作用。 ... [详细]
  • 在JavaWeb开发中,文件上传是一个常见的需求。无论是通过表单还是其他方式上传文件,都必须使用POST请求。前端部分通常采用HTML表单来实现文件选择和提交功能。后端则利用Apache Commons FileUpload库来处理上传的文件,该库提供了强大的文件解析和存储能力,能够高效地处理各种文件类型。此外,为了提高系统的安全性和稳定性,还需要对上传文件的大小、格式等进行严格的校验和限制。 ... [详细]
  • CentOS下ProFTPD的安装与配置指南
    本文详细介绍在CentOS操作系统上安装和配置ProFTPD服务的方法,包括基本配置、安全设置及高级功能的启用。 ... [详细]
  • 本文作为《WM平台上使用Sybase Anywhere 11》系列的第二篇,将继续探讨在Windows Mobile (WM) 系统中如何高效地操作Sybase Anywhere 11数据库。继上一篇关于安装与基本测试的文章之后,本篇将深入讲解数据库的具体操作方法。 ... [详细]
  • HTML:  将文件拖拽到此区域 ... [详细]
  • java类名的作用_java下Class.forName的作用是什么,为什么要使用它?
    湖上湖返回与带有给定字符串名的类或接口相关联的Class对象。调用此方法等效于:Class.forName(className,true,currentLoader) ... [详细]
  • 本文介绍了如何在两个Oracle数据库(假设为数据库A和数据库B)之间设置DBLink,以便能够从数据库A中直接访问和操作数据库B中的数据。文章详细描述了创建DBLink前的必要准备步骤以及具体的创建方法。 ... [详细]
  • 本文详细探讨了在Web开发中常见的UTF-8编码问题及其解决方案,包括HTML页面、PHP脚本、MySQL数据库以及JavaScript和Flash应用中的乱码问题。 ... [详细]
  • 在运行于MS SQL Server 2005的.NET 2.0 Web应用中,我偶尔会遇到令人头疼的SQL死锁问题。过去,我们主要通过调整查询来解决这些问题,但这既耗时又不可靠。我希望能找到一种确定性的查询模式,确保从设计上彻底避免SQL死锁。 ... [详细]
  • 本文将带你快速了解 SpringMVC 框架的基本使用方法,通过实现一个简单的 Controller 并在浏览器中访问,展示 SpringMVC 的强大与简便。 ... [详细]
  • Ext JS MVC系列一:环境搭建与框架概览
    本文主要介绍了如何在项目中使用Ext JS 4作为前端框架,并详细讲解了Ext JS 4的MVC开发模式。文章将从项目目录结构、相关CSS和JS文件的引用以及MVC框架的整体认识三个方面进行总结。 ... [详细]
  • 深入解析Struts、Spring与Hibernate三大框架的面试要点与技巧 ... [详细]
author-avatar
手机用户2602931437
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有