MySQL索引介绍及底层数据结构B+树介绍

news2024/9/22 19:44:28

索引

  • 1. 索引概述
    • 1.1 索引
    • 1.2 索引的优缺点
      • 1.2.1 优点
      • 1.2.2 缺点
  • 2. InnoDB中的索引
    • 2.1 主键索引设计方案
    • 2.2 索引底层数据结构
    • 2.3 常见索引
      • 2.3.1 聚簇索引
        • 2.3.1.1 优点
        • 2.3.1.2 缺点
      • 2.3.2 非聚簇索引
      • 2.3.3 联合索引
  • 3. MyISAM中的索引
    • 3.1 MyISAM 与 InnoDB对比

1. 索引概述

1.1 索引

  • 索引是帮助MySQL快速获取数据的一种数据结构;
  • 创建索引可以有效降低磁盘I/O的次数;

1.2 索引的优缺点

1.2.1 优点

  • 降低磁盘I/O的次数,提高数据获取效率;
  • 创建唯一索引,可以保证数据库表中每一行数据的唯一性 ;
  • 在实现数据的参考完整性方面,可以加速表和表之间的连接 。换句话说,对于有依赖关系的子表和父表联合查询时,可以提高查询速度;
  • 在使用分组和排序子句进行数据查询时,可以显著减少查询中分组和排序的时间 ,降低了CPU的消耗;

1.2.2 缺点

  • 创建和维护索引需要耗费时间;
  • 索引需要占据磁盘空间;
  • 索引会导致数据表的更新效率变低;

2. InnoDB中的索引

2.1 主键索引设计方案

  • 数据页:存储真实数据,页内数据按照主键大小依次排列;
  • 目录项记录数据页:为每个数据页建立目录项,目录项记录组成的数据页为目录项记录数据页;
  • 目录项记录数据页的页:表示范围更广的目录项记录页;

注意:每个数据页均会根据主键生成页目录,依次可进行二分查找提高查找效率;
在这里插入图片描述

2.2 索引底层数据结构

  • InnoDB存储引擎下,索引底层数据结构采用B+树实现;
  • B+树是一种多叉平衡搜索树,此树高度较低,可大幅降低磁盘I/O次数,提高搜索效率;
    在这里插入图片描述
  • 在此种结构中,只有叶子节点为真实数据页,数据页大小默认为16KB;非叶子节点均为目录项记录页,用于存储下属主键及对应数据页的页码;
  • 叶子节点之间使用双向链表连接,数据页内记录之间使用单向链表连接;
  • 叶子结点为第0层,从下往上层数变大;
  • 每个数据页有对应的页目录,由此可使用二分查找快速定位;
  • 实际工程中,B+树高度一般不会超过4层,因为高度为4层时可存储的数据量已经非常巨大;
  • 创建B+树时有三个注意点:
    1)根页面位置通过页复制、页分裂操作万年不动;
    2)内节点中目录项要保证唯一性;
    3)一个页面至少存储两条记录;

2.3 常见索引

  • 常见索引可分为聚簇索引和非聚簇索引两种;
  • 聚簇索引一般指主键索引,如果数据表没有主键,则会使用非空唯一索引替代。如果没有非空唯一索引,则InnoDB会隐式定义一个主键创建聚簇索引;
  • 非聚簇索引,也称为二级索引或辅助索引;
    在这里插入图片描述

2.3.1 聚簇索引

  • 聚簇索引一般指按照主键创建的索引;
  • 叶子结点中存储用户的完整数据记录;
  • InnoDB自动创建聚簇索引;
  • 数据页中数据按照主键进行排序;
  • 对于聚簇索引而言,“数据即索引,索引即数据”;
  • InnoDB支持聚簇索引,而MyISAM不支持聚簇索引;
  • 数据的物理存储排序方式只有一种,因此每个数据表有且仅有一个聚簇索引,一般为主键索引;
  • 为充分利用聚簇索引的聚簇特性,数据表一般选用有序的顺序id作为主键
    在这里插入图片描述

2.3.1.1 优点

  • 数据访问速度更快,相比二级索引而言不用回表;
  • 对于主键的排序查找和范围查找速度非常快;
  • 聚簇特性使得磁盘I/O次数更低;

2.3.1.2 缺点

  • 插入速度严重依赖插入顺序;
  • 主键更新代价很高;
  • 二级索引查找数据需要两次索引查找,涉及回表操作;

2.3.2 非聚簇索引

  • 非聚簇索引为根据非主键创建的索引;
  • 非聚簇索引底层结构中非叶子结点与聚簇索引结构类似,区别在于非聚簇索引的叶子结点中只存储索引创建时依据的字段值以及该记录对应主键值;
  • 非聚簇索引数据页中的数据依据对应字段排序;
  • 根据非聚簇索引查找数据时,先确定该字段值对应的主键值,然后通过聚簇索引确定完整记录,此操作称为回表操作;
    在这里插入图片描述

2.3.3 联合索引

  • 联合索引本质也是二级索引;
  • 联合多个非主键列创建二级索引,称为联合索引;
  • 数据页中数据同时根据多个列进行排序;

在这里插入图片描述

3. MyISAM中的索引

  • MyISAM存储引擎中默认采用B+树实现索引;
  • MyISAM不支持聚簇索引,可将其索引理解为二级索引;
  • MyISAM下索引叶子结点中每个记录存储真实数据记录对应的地址;
  • MyISAM索引文件与数据文件分开存储;

在这里插入图片描述

3.1 MyISAM 与 InnoDB对比

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/728904.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

代码随想录算法训练营第59天 | 503.下一个更大元素 II + 42.接雨水

今日任务 目录 503.下一个更大元素 II - Medium 42.接雨水 - Hard 503.下一个更大元素 II - Medium 题目链接:力扣-503. 下一个更大元素 II 给定一个循环数组 nums ( nums[nums.length - 1] 的下一个元素是 nums[0] ),返回 nu…

vmware提示此平台不支持虚拟化的Intel VT-x/EPT. 不使用虚拟化的Intel VT-x/EPT,是否继续?

当打开虚拟机时会发现弹出提示框显示不支持,只要检查三个步骤保证能正常使用 1、检查vmware虚拟机设置中处理器右边是否勾选虚拟化引擎 2、检查物理机中的windows组件是否冲突 打开控制面板选择程序和功能之后点击启用或关闭windows功能,取消Hyper-V 取…

插值算法

插值法在较少的数据模型的基础上模拟产生新的靠谱数值,可以用来预测。 利用已知的点建立合适的插值函数 f(x) ,未知点 x_i 由插值函数 f(x) 可以求出函数值 f(x_i) ,用求得的 (x_i,f(x_i))近似代替未知点。 基本概念: yf(x)在[a,b]上有定义 x…

MySQL之概述、安装和使用(一)

一、概述 关系数据库概述: https://blog.csdn.net/qq_21370419/article/details/128568920 二、数据库的安装 参考我的两篇博客: win10 安装mysql 5.6.36版本_windows 安装mysql5.6_人……杰的博客-CSDN博客 wind 10 安装 mysql 8.0_人……杰的博客…

二十三种设计模式第十五篇--模版方法模式

模板方法模式是一种行为型设计模式,它定义了一个算法的骨架,而将一些步骤延迟到子类中实现。通过使用这种模式,我们可以在不改变算法结构的情况下,重新定义算法中的某些特定步骤。 模版方法的思想 模板方法模式的核心思想是将一…

WebDAV之π-Disk派盘 + FE文件管理器

FE File Explorer是一款功能强大且易于使用的文件管理器,它可以让你轻松地管理内部和外部存储器上的文件和文件夹,支持云存储服务,如派盘、Dropbox等。结合FE File Explorer和派盘可以实现更加高效便捷的文件管理体验。 π-Disk派盘 – 知识…

#systemverilog#进程控制问题#(二)终止进程

二 线程的终止 2.1 命名块 + diable Block,也就是语句块,SystemVerilog提供了两种类型的语句块,分别是begin…end为代表的顺序语句块,还有以fork…join为代表的并发语句块。 这两种block都是工程项目中常用的block,但是,大家可能都不知道block也是可以命名的,就像我…

基于Prometheus 和 Grafana 实现springboot应用监控和服务器监控

目录 1.Prometheus环境搭建 1.1 下载和安装Prometheus 1.2 配置Prometheus 1.3 配置Prometheus抓取Spring Boot应用Metrics 1.4 启动Prometheus 2.Grafana环境搭建 2.1 下载和安装Grafana 2.2 配置Grafana数据源 2.3 创建Dashboard 3、NodeExporter(服务器…

华为云Astro出品《低代码开发者101问》电子书上线

这四年来,在低代码平台的运营和客户支持过程中,我们有幸见证了华为云低代码的成长,也有幸认识了很多有思想、有热情、有行动力的低代码开发者朋友,我们自身对低代码领域的认识和理解也在不断整合、刷新。与开发者、客户、伙伴以及…

Vue3使用混入(混合)

minixs/entity.js:混入代码 //混入的实体类 import { reactive } from vue;const userEntityMixin {setup() {const Admin reactive({id: -1,account: "",userPassword: "",});const Teacher reactive({id: -1,account: "",userP…

Nginx启动、关闭及信息查看命令

1、查找Nginx的位置 ps -aux | grep nginx 2、启动Nginx nginx直接启动,这时候可能出现两种情况: 第一种,就是Nginx已经启动过了,会提示端口被占用,启动失败 我们尝试杀掉占用端口的进程,然后重启 sys…

基于springboot图书个性化推荐系统的设计与实现【附ppt和万字文档(Lun文)和搭建文档】

主要功能 前台登录: ①首页:图书名称查询、图书信息推荐、好书推荐、图书信息展示 ②图书信息:图书类别、图书名称、名称类别作者查询、图书详情、收藏、点赞、评论 ③好书推荐:图书展示、点击查看 ④留言反馈:用户可…

爆肝整理,Docker容器测试-常见问题+解决(汇总)

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 问题1&#xff1a…

9 首页和图标定制

9.1 首页 springboot的首页是写在index.html中,而index.html可以放在静态资源存放的任何一个文件夹(public、resources、static)。然后,直接运行,访问localhost:8080即可。 9.2 图标定制 对于springboot2.7.13版本&am…

应用层:域名系统DNS

1.应用层:域名系统DNS(Domain Name System) 笔记来源: 湖科大教书匠:应用层概述 湖科大教书匠:域名系统DNS 声明:该学习笔记来自湖科大教书匠,笔记仅做学习参考 DNS报文使用运输层的…

Rust 动态数组Vec基本概念及其用法

目录 一、基本概念 Vec是什么? Vec的特点 (1)动态大小: (2)可变性: (3)泛型: 二、基础用法 1. 创建 (1) Vec::new()方法 (2) Vec::from()方法 (3) vec! 宏 2. 基础用法 三、Vec的简单实现及其宏模拟 四、leetcode 实…

vue开发图表echarts基本使用

官网传送门 1.echarts-介绍 是一个js插件 性能好可流畅远行PC和移动设备 兼容主流浏览器 提供很多图标,用户且可自行修改。 2.使用npm安装 npm install echarts3.echarts-基础配置 series -- 系列列表。每个系列通过 type 决定自己的图表类型 -- 大白话&#xff…

Web安全——数据库mysql学习

数据库mysql基础 Web安全分享一、数据库的基本操作1、MYSQL登录与退出2、MYSQL数据库的一些解释3、MYSQL注释符有三种: 二、数据库的一些基本操作1、数据库的增删改查(sql语句) 三、table 表的操作1、查看表结构2、查看表的内容3、建立表4、约束条件5、修改表的操作…

小红书发布图文视频笔记软件

小红书发布图文视频笔记软件,🆘这个工具,不愧是做小红书的神!附教程#新媒体 #微信创作者助手 #小红书 微信时刻 软件有月卡、季卡、半年卡、年卡 【引流脚本软件开发定制,欢迎你】 服务时间:(8&#xff1a…

公司新来了个测试,一副毛头小子的样儿,哪想到是新一代卷王。。。

内卷,是现在热度非常高的一个词汇,随着热度不断攀升,隐隐到了“万物皆可卷”的程度。 在程序员职场上,什么样的人最让人反感呢? 是技术不好的人吗?并不是。技术不好的同事,我们可以帮他。 是技术太强的人吗?也不是…