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

索引

  • 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.hqwc.cn/news/12989.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

代码随想录算法训练营第十一天 | 二叉树系列2

二叉树系列2 101 对称二叉树二叉树很重要的一点:确定遍历顺序关于递归代码随想录的代码我的代码(理解后编写) 100 相同的树我的代码 572 另一个树的子树我的代码录友的代码,只用递归!!! 104 二叉树的最大深度重点代码随…

17.OpenCV中的GFTTDetector类

文章目录 GFTTDetector功能OpenCV中GFTTDetector类reference 欢迎访问个人网络日志🌹🌹知行空间🌹🌹 这是使用imgproc.hpp中的goodFeaturesToTrack函数封装的类,其使用和goodFeaturesToTrack函数基本相似。 GFTTDetec…

【算法与数据结构】20、LeetCode有效的括号

文章目录 一、题目二、解法三、完整代码 所有的LeetCode题解索引,可以看这篇文章——【算法和数据结构】LeetCode题解。 一、题目 二、解法 思路分析:括号匹配是使用栈解决的经典问题。做这道题首先要分析什么时候括号不匹配。1、右括号多余 ( { [ ] } )…

PCL 法向量估计源码学习

一、思路&#xff1a; 二、源码 #ifndef PCL_FEATURES_IMPL_NORMAL_3D_H_ #define PCL_FEATURES_IMPL_NORMAL_3D_H_#include <pcl/features/normal_3d.h>/// template <typename PointInT, typename PointOutT> void pcl::NormalEstimation<PointInT, PointOutT…

【stability.ai】SDXL:改进高分辨率图像合成的潜在扩散模型

github&#xff1a;https://github.com/Stability-AI/stablediffusion 试用&#xff1a; https://clipdrop.co/stable-diffusion https://dreamstudio.ai/ 介绍 近年来&#xff0c;深度生成建模在自然语言、音频和视觉媒体等各个数据领域取得了巨大的突破。本文将重点关注视…

nohup命令解决SpringBoot/java -jar命令启动项目运行一段时间自动停止问题

问题描述&#xff1a; 在centos7上部署多个springcloud项目。出现了服务莫名其妙会挂掉一两个的问题&#xff0c;重新启动挂掉的服务之后又会出现其他服务挂掉的情况&#xff0c;查看启动日志也并没有发现有异常抛出。令人费解的是所有的服务都是通过nohup java -jar xxx.jar …

TCP / IP 参考模型

TCP / IP 参考模型 5层参考模型5层参考模型5层模型的数据封装 5层参考模型 5层参考模型 综合 OSI 和 TCP/IP 的优点应用层: 支持各种网络应用 FTP, SMTP, HTTP 传输层: 进程-进程的数据传输 TCP, UDP 网络层: 源主机到目的主机的数据分组路由与转发 IP协议、路由协议等 链路层…

JS中的扁平化数据转换为树形结构数组

递归方法和循环方法&#xff0c;我都写了两种代码&#xff0c;仅供参考。 三种递归方法&#xff0c;两种循环方法&#xff0c;本质上都一样&#xff0c;就是写法不一样&#xff0c;加油&#xff01;&#xff01;&#xff01; // 数据 const arr [{ id: 1, name: 广东, pid:…

还在手动下载github项目?想要自动化下载github项目?基于python开发项目自动下载模块帮你实现自动下载存储

GitHub是一个基于Web的代码托管平台和开发者社区。它允许开发者存储、管理和分享他们的代码&#xff0c;并进行版本控制。开发者可以在GitHub上创建仓库来存储项目代码&#xff0c;并使用Git来跟踪和管理代码的变更历史。GitHub提供了一系列协作工具&#xff0c;如问题追踪、Pu…

Vue实现在线文档预览

目录 背景在线预览Office文档文件在线预览pdf文档预览方案一方案二 Word文档预览Excel文档预览PPT文档预览 纯文本、各种代码文件预览图片文件预览视频文件预览Aliplayer阿里云播放器Xgplayer西瓜播放器Bilibiliplayer仿哔哩哔哩弹幕播放器 音频文件预览在线文档预览项目&#…

POE级联蓝牙定位系统方案_蓝牙信标,蓝牙网关,级联蓝牙网关

近年来,随着新能源行业的快速发展,在化工厂,核电厂以及电力电厂等企业,对人员定位,人员导航,资产定位,生命体征监测的需求越来越大。传统的蓝牙室内定位方案中蓝牙信标为锂亚电池供电,需定期更换电池且有安全隐患,为更好的服务有蓝牙定位导航,被动人员定位,生命体征…

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

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