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

Mysql高级之索引结构详解

Mysql的索引详解

  • 1.索引定义
  • 2.索引结构
    • 2.1数据结构分析
      • 2.1.1熟知的数据结构
      • 2.1.2分析为什么这么多的数据结构不全适用于索引结构
    • 2.2Hash结构
    • 2.3B+ tree结构
  • 3.索引分类
    • 3.1聚集索引(聚簇索引)
    • 3.2非聚集索引(稀疏索引)
    • 3.3联合索引
    • 3.4主键索引和非主键

1.索引定义

索引是mysql帮我们排好序的数据结构,可以更快捷的查找数据

2.索引结构

2.1数据结构分析

2.1.1熟知的数据结构

  • hash
  • 二叉树
  • 红黑树
  • B-tree

2.1.2分析为什么这么多的数据结构不全适用于索引结构

  • 二叉树:其中二叉树有个众所周知的问题,就是容易形成“歪脖子”树,形成类似链表的结构查询速度很慢。
  • 红黑树:红黑树对二叉树做了优化,保证了左子树和右子树的均衡,不会出现歪脖子树,但是缺点是层级太深,不适合作为mysql的索引结构(索引的查找方式会在下面进行分析)

索引的查找方式:索引结构实际上存储在磁盘上的文件中,mysql根据索引定位,每定位一个位置后都需要加载到内存中然后在查找下一层级,如果层级很深就需要进行多次磁盘io,而这个操作是很耗时的。

总结:排除掉二叉树和红黑树后适合作为索引结构就是hash结构和B-tree

但是实际上mysql的索引结构使用的是B+tree,这里就需要说明B-tree和B+tree的区别了。
B-tree和B+tree的区别

  • 非叶子节点不存储数据,只存储索引(因为叶子节点有全量的索引,非叶子节点存储的为冗余索引),这样可以在非叶子节点的层级放更多的索引。
  • 叶子节点包含所以的索引
  • 叶子节点使用指针链接,提高了区间的访问能力

针对上面说的非叶子节点存储更多的索引做解释:
我们知道mysql在加载索引时一个磁盘页的大小为16k,如果非叶子节点存储数据,那么它的大小就远远大于只存储索引时的大小。所以如果非叶子节点只存储索引数据,那么一个磁盘页加载的索引数据就更多,减少了磁盘加载次数,这样可以优化mysql的查询效率。

2.2Hash结构

hash结构有个好处,就是查找的时候只需要对key进行一次hash运算就能算出存储位置。但是也存在这很多问题,比如hash冲突,以及sql中的范围查询。所以一板情况下我们不是hash结构建立索引。

2.3B+ tree结构

B+tree结构可以很好的解决索引数据存储层级过深的问题,而且相比与B-tree优化了每个磁盘页可加载的索引数量,同时在叶子节点使用指针链接,提高了区间的访问能力,我们常用的索引结构就是B+tree.

3.索引分类

3.1聚集索引(聚簇索引)

聚集索引实际上是一种文件存储方式,索引文件和数据文件存储在一起称之为聚集索引
InnoDB存储引擎的索引和数据就存放在一个文件。
在这里插入图片描述
主键索引的叶子节点存储的就是响应的行数据

3.2非聚集索引(稀疏索引)

索引文件和数据文件分开存储称为非聚集索引
MyISAM存储引擎的索引文件和数据文件分开存储。
在这里插入图片描述主键索引的叶子节点指向数据存储的位置,通过主键索引定位到数据后需要再根据主键索引指向的位置加载相应数据

3.3联合索引

多列字段联合建立索引,按照执行顺序一次排序。

3.4主键索引和非主键

在这里插入图片描述

在这里插入图片描述非主键索引的叶子节点存储的是主键索引,需要进行回表操作,根据定位的主键索引在进行查询对应的行数据。
回表:跨两个B+tree查找数据,我们称之为回表操作。

由此可以引发很多索引优化需要注意的地方,比如可以通过二级索引直接查询的结果避免回表查询。(假设联合索引为二级索引,查询数据时使用覆盖索引,所有查询字段在二级索引树就能获取到,此时就直接在二级索引树查询结果返回,另外二级索引树因为不存具体行数据,索引比主键索引小因此效率也能更高)

相关文章:

Mysql高级之索引结构详解

Mysql的索引详解1.索引定义2.索引结构2.1数据结构分析2.1.1熟知的数据结构2.1.2分析为什么这么多的数据结构不全适用于索引结构2.2Hash结构2.3B tree结构3.索引分类3.1聚集索引(聚簇索引)3.2非聚集索引(稀疏索引)3.3联合索引3.4主…...

【线程-J.U.C】

Lock J.U.C最核心组件,Lock接口出现之前,多线程的并发安全只能由synchronized处理,但java5之后,Lock的出现可以解决synchronized的短板,更加灵活。 Lock本质上是一个接口,定义了释放锁(unlock&…...

docker布署spring boot jar包项目

目录docker 安装创建目录制作镜像启动容器查看日志docker 安装 Docker安装、详解与部署 创建目录 服务器中创建一个目录,存放项目jar包和Dockerfile 文件 mkdir /目录位置创建目录后创建Dockerfile文件,上传jar包到同一目录下 创建dockerfile vim Doc…...

极简Vue3教程--Pinia状态管理

Pinia(发音为/piːnjʌ/,如英语中的“peenya”)是最接近pia(西班牙语中的菠萝)的词;Pinia开始于大概2019年,最初是作为一个实验为Vue重新设计状态管理,让它用起来像组合式API&#x…...

常用的map转bean互转方法

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 常用的map转bean互转方法一、hutool工具类二、fastjson工具类三、beanutils_BeanUtils工具类 不太好用四、cglib BeanMap工具类 不太好用五、reflect 反射来玩 不太好玩六、I…...

2.4G收发一体芯片NRF24L01P跟国产软硬件兼容 SI24R1对比

超低功耗高性能 2.4GHz GFSK 无线收发器芯片Si24R1,软硬件兼容NRF24L01P. Si24R1 是一颗工作在 2.4GHz ISM 频段,专为低功耗无线场合设计,集成嵌入式ARQ 基带协议引擎的无线收发器芯片。工作频率范围为 2400MHz-2525MHz,共有 126个…...

设计模式之七大原则(一)——单一职责原则、开放-关闭原则

目录一、设计模式的目的二、设计模式的七大原则1.单一职责原则2.开放-关闭原则一、设计模式的目的 设计模式的目的是为了提高代码重用性、可读性、可扩展性、可靠性,使得程序呈现出高内聚、低耦合的特性。 代码重用性(相同功能的代码,不用多…...

C++ set、unordered_set、multiset它们之间的区别与一些使用方法(不断更新)

set、unordered_set、multiset是什么?以及它们之间的区别 首先,它们三个都是C标准库提供的关联容器中的一种。只不过set、multiset容器是有序的,而unordered_set容器是无序的 std::set 是 C 标准库中的一个容器,其存储的元素按设…...

hadoop调优

hadoop调优 1 HDFS核心参数 1.1 NameNode内存生产配置 1.1.1 NameNode内存计算 每个文件块大概占用150byte,如果一台服务器128G,能存储的文件块如下 128 (G)* 1024(MB) * 1024(KB) * 1024(Byte) / 150 Byte 9.1 亿 1.1.2 Hadoop2.x 在Hadoop2.x中…...

EM@三角函数诱导公式

文章目录诱导公式单位圆坐标和三角函数记忆口诀符号看象限奇变偶不变例常用诱导公式🎈常用部分(5对)倒数关系六种三角函数间的转换关系小结ReflectionsShifts and periodicity诱导公式 诱导公式 - 维基百科,自由的百科全书 (wikipedia.org) 单位圆坐标…...

是不是只能学IT互联网技术才有发展前途?

当然不是,三百六十行,行行出状元。 但我们需要认清一个现实是,我们正处于一个信息爆炸的时代,掌握紧跟潮流的技术,才可以让我们更自信地面对每天的生活,才有多余的精力、财力来享受生活。“人生在世&#…...

Linux 进程:exit和_exit的辨析

目录1.接口与函数2.缓冲区3.exit 与 _exit(1)_exit(2)exit这里来认识exit函数和 _exit接口 ,它们的作用是类似的,都是在调用后退出程序,可以在程序的任何地方调用。 1.接口与函数 exit函数和_exit接口,一个函数,一个…...

智能电子标签——商超版价签

2.1英寸TFT黑白电子价签 ★ 快速变价,高效运营 ★ 市场实用,布局物联网未来 ★ 更好客户体验 ★ 降低系统成本,具备竞争力 ★ 2.1英寸黑白红电子价签 ★ 电池低能耗,常规使用三年 ★ 穿透力强不慣障碍 ★ 2.4G载波&#x…...

计算机网络自检

1 计网体系结构 因特网结构: 计网三个组成成分: 工作方式-其中2个部分: 功能-两个子网: 5个XAN分别是: 传输技术,两者的主要区别: 4种基本网络拓扑结构: 3种交换技术: 协…...

DC真实数据都有哪些?Filecoin为DC数据存储的解决方案又是什么?

对于生活在数字时代的我们而言,数据或许就和平日呼吸的空气一样,已经不需要我们再去思考其概念。我们的日常生活中无时无刻都有数据的身影,日常的购物消费、出行、学习、记录,当我们每天生活有数字化加持的小区里,工作…...

解决vscode无法自动更新

一.前言 要在vscode里面安装插件,被提示版本不匹配,然后得更新,然后我发现我的'帮助'菜单栏下没有检查更新,然后我去&…...

315线上知识竞赛答题活动方案及模板分享

315线上知识竞赛答题活动方案及模板分享在315国际消费者权益日来临之际, 很多单位推出有奖知识竞答, 希望大家在了解专业知识的同时, 还可以拿到自己喜欢的奖品!这是消费者委员会和监管局联合举办的“315消费知识在线有奖竞答”活…...

论文复现-2:代码部分

以CONLL03数据集为例 文章目录1 整体框架2 数据结构2.1 原始数据集2.2 处理之后的数据集3 代码部分3.0 模型参数3.1 数据预处理3.2 模型方法3.1.1 定义表示的学习权重项的学习双塔模型3.2.2 forward3.3 损失函数3.4 训练与推理Ablation study训练实例1 整体框架 任务是实体识别…...

Linux开放的端口太多了?教你一招找出所有开放的端口,然后直接干掉!

基于服务器安全性维护的目的,查看所有开放的端口是通常采取的第一步,从中检查出可疑或者不必要的端口并将其关掉。关于查看开放的端口,方法不止一种,比如lsof 命令,还可以使用 ss 命令。 查看开放的端口 今天我们就介…...

mysql集群简介

集群的好处 高可用性:故障检测及迁移,多节点备份。 可伸缩性:新增数据库节点便利,方便扩容。 负载均衡:切换某服务访问某节点,分摊单个节点的数据库压力。 集群要考虑的风险 网络分裂:群集还…...

终极Evergreen UI包大小优化指南:如何减少65%的React组件库体积

终极Evergreen UI包大小优化指南:如何减少65%的React组件库体积 【免费下载链接】evergreen 🌲 Evergreen React UI Framework by Segment 项目地址: https://gitcode.com/gh_mirrors/evergreen1/evergreen 在现代前端开发中,React组件…...

如何用炉石传说脚本实现智能卡牌决策?2024最新配置指南

如何用炉石传说脚本实现智能卡牌决策?2024最新配置指南 【免费下载链接】Hearthstone-Script Hearthstone script(炉石传说脚本)(2024.01.25停更至国服回归) 项目地址: https://gitcode.com/gh_mirrors/he/Hearthsto…...

Android多屏异显开发避坑指南:Surface/BufferQueue API的正确打开方式

Android多屏异显开发实战:从SurfaceFlinger到BufferQueue的深度解析 在智能家居控制面板、车载双屏系统以及商业展示设备等场景中,Android多屏异显技术正成为开发者必须掌握的技能。不同于简单的屏幕镜像,真正的多屏异显需要精确控制每个显示…...

新手必看!KDJ与MACD组合使用的5个实战技巧(附A股案例图解)

KDJ与MACD组合实战指南:5个让新手快速上手的交易技巧 刚接触股票技术分析时,面对满屏的指标线总让人眼花缭乱。作为最经典的两大指标,MACD和KDJ的组合使用能帮我们看清市场本质——MACD像一位沉稳的船长,指引着趋势航向&#xff1…...

删除文件夹,被提示“需要来自 TrustedInstaller 的权限。。。”的解决方案

问题 windows安装助手升级系统后,生成Windows.old的文件夹,占用C盘30G,准备删除它。结果提示:文件夹访问被拒绝。 比如以删除 windows.old 下的 Program Files (x86)为例:解决步骤 1. 右键文件夹,选择&…...

StructBERT中文相似度模型效果实测:中文专利摘要与权利要求语义一致性校验

StructBERT中文相似度模型效果实测:中文专利摘要与权利要求语义一致性校验 重要提示:本文所有测试均在技术验证环境下进行,结果仅供参考。实际应用请确保符合相关法律法规和行业规范。 1. 模型简介与测试背景 StructBERT中文文本相似度模型是…...

Qwen3.5-27B图文理解教程:支持base64编码图片直传,适配移动端集成

Qwen3.5-27B图文理解教程:支持base64编码图片直传,适配移动端集成 1. 引言:让AI看懂你的世界 想象一下,你拍了一张办公桌上凌乱文件的照片,直接发给AI助手,问它:“帮我整理一下这些文件的优先…...

基于嵌入式的数据库SQLite

轻量级的嵌入式数据库sqlite 1 SQLite3的安装 采用在线安装,在linux命令行:sudo apt install sqlite3 在命令行输入sqlite3,显示如下界面则表示安装成功。 2 SQLite3的基本指令 系统命令 .quit 退出数据库 .help 数据…...

5步完成私有音乐服务器部署:打造专属音乐空间

5步完成私有音乐服务器部署:打造专属音乐空间 【免费下载链接】any-listen A cross-platform private song playback service. 项目地址: https://gitcode.com/gh_mirrors/an/any-listen any-listen是一款跨平台的私人音乐播放服务,支持添加并播放…...

基于YOLOv8的手势识别系统

基于 YOLOv8 目标检测框架的手势识别系统,支持图片、视频、摄像头实时检测,并提供训练、可视化与历史管理等功能。一、项目概述本系统采用 YOLOv8 作为检测骨干网络,对 18 类手势进行识别。系统包含完整的训练流程与桌面端应用,支…...