MySQL之索引结构

news2024/11/15 8:34:58

索引概述

索引是帮助MySQL高效获取数据数据结构(有序)。

在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据,这样就可以在这些数据结构上实现高级查找算法,这种数据结构就是索引。

下图演示有索引和无索引的区别:

备注:上述二叉树索引结构的只是一个示意图,并不是真实的索引结构

优缺点

优势:

1、提高数据检索的效率,降低数据库的I/O成本。

2、通过索引列对数据进行排序,降低数据排序的成本,降低CPU的消耗。

劣势(基本忽略):

1、索引列也是要占用空间的(但是现在磁盘很便宜)

2、索引大大提高了查询效率,同时也降低了更新表的速度,如对表进行插入、删除、更新时,效率降低。

索引结构

MYSQL的索引是在存储引擎层实现的,不同的存储引擎有不同的索引结构主要包含以下几种:

索引结构

描述

B+Tree索引最常见的索引类型,大部分引擎都支持B+树索引
Hash索引底层数据结构是用哈希表实现的,只有精确匹配索引列的查询才生效,不支持范围查询
R-tree(空间索引)空间索引是MYISAM引擎的一个特殊索引类型,用于地理空间数据类型,通常使用比较少
Full-text(全文索引)是一种通过建立倒排索引,快速匹配文档的方式

B+Tree索引

二叉树

左边的节点的值比父节点值小,右边节点的值比父节点值大

二叉树缺点:顺序插入时,会形成一个链表,查询性能大大降低。在大多数情况下层级较深检索速度慢。

红黑二叉树(自平衡二叉搜索树)

红黑树是一种高效的自平衡二叉查找树,用于存储有序的数据,并在插入和删除操作时能够快速地进行调整以保持其性质。

B-Tree树(多路平衡查找树)

以一颗最大数(max-degree)为5(5阶)的b-tree为例(每个节点最多存储4个key,5个指针)

注意:树的度数指的是一个节点的子节点个数。

插入:100 65 169 368 900 556 780 35 215 1200 134 888 158 90 1000 88 120 268 250

具体动态变化过程参考网站:https://www.cs.usfca.edu/~galles/visualization/BTree.html

B+Tree树

插入:100 65 169 368 900 556 780 35 215 1200 234 888 158 90 1000 88 120 268 250

动态变化过程参考网站:https://www.cs.usfca.edu/~galles/visualization/BPlusTree.html

相较于B-Tree区别:

1、所有数据都会出现在叶子节点

2、叶子节点形成一个单向链表

MySQL中B+Tree树

MYSQL索引数据结构对经典的B+Tree树进行了优化。在原B+Tree的基础上,增加一个指向相邻叶子节点的链表指针,就形成了带有顺序指针的B+Tree,提高了访问性能。

Hash

哈希索引就是采用一定的哈希算法,将键值换算成对应的哈希值,映射到对应的槽位上,然后存储在哈希表中。

如果两个(或多个)键值,映射到一个相同的槽位上,他们就会产生哈希冲突(也称哈希碰撞),可以通过链表来解决。

哈希索引特点

1、哈希索引只能用于对等比较(=,in),不支持范围查询(between,>,<)

2、无法利用索引完成排序操作

3、查询效率高,通常只需要一次检索就可以了,效率高于B+Tree索引

存储引擎支持

在MySQL中,支持hash索引的是MEMORY引擎,而InnoDB中具有自适应的哈希功能,哈希索引是存储引擎根据B+Tree索引在指定条件下自动构建的。

面试题:为什么InnocentDB存储引擎选择使用B+Tree索引结构?

1、相较于二叉树,层级更少,搜索效率高;

2、对于b-tree,无论是叶子节点还是非叶子节点,都会保存数据,这样导致一页中存储的键值减少,指针也跟着减少,要同样保存大量数据,只能增加树的高度,导致性能下降;

3、相较于哈希索引,B+Tree支持范围匹配和排序操作

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

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

相关文章

JMeter实操入门之登录

JMeter实操入门之登录 前言初级-无变量的登录线程组取样器-HTTP请求 进阶-定义变量的登录用户定义的变量获取JSON返回的数据-tokentoken设置全局变量 前言 安装及环境配置教程可移步&#xff1a;JMeter安装与配置环境 本篇文章针对小白进一步的认识及运用JMeter&#xff0c;围绕…

从数据角度分析年龄与NBA球员赛场表现的关系【数据分析项目分享】

好久不见朋友们&#xff0c;今天给大家分享一个我自己很感兴趣的话题分析——NBA球员表现跟年龄关系到底大不大&#xff1f;数据来源于Kaggle&#xff0c;感兴趣的朋友可以点赞评论留言&#xff0c;我会将数据同代码一起发送给你。 目录 NBA球员表现的探索性数据分析导入Python…

ChatGPT与文心一言:AI助手之巅的对决

随着科技的飞速发展&#xff0c;人工智能助手已经渗透到我们的日常生活和工作中。 而在这个充满竞争的领域里&#xff0c;ChatGPT和文心一言无疑是最引人注目的两款产品。它们各自拥有独特的优势&#xff0c;但在智能回复、语言准确性、知识库丰富度等方面却存在差异。那么&am…

【设计模式】责任连模式怎么用?

我将通过一个贴近现实的故事——请假审批流程&#xff0c;带你了解和掌握责任链模式。 什么是责任链模式&#xff1f; 责任链模式是一种行为设计模式&#xff0c;它让你可以避免将请求的发送者与接收者耦合在一起&#xff0c;让多个对象都有处理请求的机会将这个对象连成一条…

RabbitMQ入门篇【图文并茂,超级详细】

&#x1f973;&#x1f973;Welcome 的Huihuis Code World ! !&#x1f973;&#x1f973; 接下来看看由辉辉所写的关于Docker的相关操作吧 目录 &#x1f973;&#x1f973;Welcome 的Huihuis Code World ! !&#x1f973;&#x1f973; 前言 1.什么是MQ 2.理解MQ 3.生活…

探秘网络爬虫的基本原理与实例应用

1. 基本原理 网络爬虫是一种用于自动化获取互联网信息的程序&#xff0c;其基本原理包括URL获取、HTTP请求、HTML解析、数据提取和数据存储等步骤。 URL获取&#xff1a; 确定需要访问的目标网页&#xff0c;通过人工指定、站点地图或之前的抓取结果获取URL。 HTTP请求&#…

MySQL中SELECT字句的顺序以及具体使用

目录 1.SELECT字句及其顺序 2.使用方法举例 3.HAVING和WHERE 1.SELECT字句及其顺序 *下表来自于图灵程序设计丛书&#xff0c;数据库系列——《SQL必知必会》 2.使用方法举例 *题目来源于牛客网 题目描述 现在运营想要查看不同大学的用户平均发帖情况&#xff0c;并期望结…

【JavaScript】面向后端快速学习 笔记

文章目录 JS是什么&#xff1f;一、JS导入二、数据类型 变量 运算符三、流程控制四、函数五、对象 与 JSON5.1 对象5.2 JSON5.3 常见对象1. 数组2. Boolean对象3. Date对象4. Math5. Number6. String 六、事件6.1 常用方法1. 鼠标事件2. 键盘事件3. 表单事件 6.2 事件的绑定**1…

深入Docker5:安装nginx部署完整项目

目录 准备 为什么要使用nginx mysql容器构建 1.删除容器 2.创建文件夹 3.上传配置文件 4.命令构建mysql容器 5.进入mysql容器&#xff0c;授予root所有权限 6.在mysql中用命令运行sql文件 7.创建指定数据库shop 8.执行指定的sql文件 nginx安装与部署 1.拉取镜像 2…

/var/run/yum.pid 已被锁定,PID 为 2762 的另一个程序正在运行解决方法

一、问题 /var/run/yum.pid 已被锁定&#xff0c;PID 为 2762 的另一个程序正在运行 二、原因 这个提示意味着在你的Linux系统中&#xff0c;有一个yum&#xff08;或者dnf&#xff0c;在较新版本的Fedora和RHEL/CentOS 8中&#xff09;进程正在运行&#xff0c;并且它已经创建…

Vue基知识五

一 vue配置代理 1.1 跨域 JQuery大多数封装的是对DOM的操作&#xff0c;而VUE是要减少对DOM的操作&#xff0c;所以VUE里很少用JQuery&#xff0c;而是用axios发送请求&#xff1b;JQuery与axios都是对xhr进行的封装&#xff1b; 下载并引入axios npm i axios点击按钮请求后…

tx2开发板升级JetPack至最新

最近一个项目用到了tx2, 上面的jetpack太老了需要更新&#xff0c;很久没和开发板打交道了&#xff0c;记录一下。中间没怎么截图&#xff0c;所以可能文字居多。 准备工作 Ubuntu 18.04的机器&#xff0c;避免有坑&#xff0c;不要使用虚拟机&#xff0c;一定要是物理机&…

学习笔记应用——创建用户账户并且拥有自己的信息

一、创建用户账户 将建立一个用户注册和身份验证系统&#xff0c;让用户能够注册账户&#xff0c;进而登录和注销。我们将创建一个新的应用程序&#xff0c;其中包含与处理用户账户相关的所有功能。 创建user 我们首先使用命令 startapp 来创建一个名为 users 的应用程序&…

【无标题】Spring Boot整合MyBatis-Plus,并通过AutoGenerator生成编程喵项目骨架代码**

​ 作为一名 Java 后端开发&#xff0c;日常工作中免不了要生成数据库表对应的持久化对象 PO&#xff0c;操作数据库的接口 DAO&#xff0c;以及 CRUD 的 XML&#xff0c;也就是 mapper。 Mybatis Generator 是 MyBatis 官方提供的一个代码生成工具&#xff0c;完全可以胜任这…

AI学习(2): PyTorch2.x环境安装

1.介绍 注:下面是对PyTorch进行了简单的介绍&#xff0c;不喜欢可直接跳过。 1.1 什么是PyTorch PyTorch是一个由Facebook人工智能研究团队开发的开源机器学习库&#xff0c;用于开发人工智能和深度学习的应用程序。PyTorch支持广泛的机器学习和深度学习算法&#xff0c;并基于…

鸿蒙开发系列教程(五)--ArkTS语言:组件开发

1、基础组件 组件API文档&#xff1a;https://developer.huawei.com/consumer/cn/doc/harmonyos-references-V2/84_u58f0_u660e_u5f0f_u5f00_u53d1_u8303_u5f0f_uff09-0000001427744776-V2 查看组件API 外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传 容…

gdip-yolo项目解读:gdip模块 |mdgip模块 |GDIP regularizer模块的使用分析

gdip-yolo是2022年提出了一个端到端的图像自适应目标检测框架&#xff0c;其论文中的效果展示了良好的图像增强效果。其提出了gdip模块 |mdgip模块 |GDIP regularizer模块等模块&#xff0c;并表明这是效果提升的关键。为此对gdip-yolo的项目进行深入分析。 gdip-yolo的论文可以…

Linux网络命令

一、网络配置命令 查看linux基础的网络设置&#xff1a; 网关&#xff1a;route -nIP地址&#xff1a;ifconfig ip aDNS服务器&#xff1a;cat /etc/resolv.conf主机名&#xff1a;hostname路由&#xff1a;route -n网络连接状态&#xff1a;ss 或 netstat域名解析nslookup ho…

【ARMv8M Cortex-M33 系列 7.2 -- HardFault 问题定位 1】

请阅读【嵌入式开发学习必备专栏 之 ARM Cortex-Mx专栏】 文章目录 问题背景堆栈对齐要求Cortex-M33 的 FPU 功能 问题背景 rt-thread 在PendSV_Handler退出的时候发生了HardFault_Handler是什么原因&#xff1f;且 LR 的值为0xfffffffd 堆栈对齐要求 在 ARM Cortex-M 架构中…

【已解决】Qt Creator设计模式被禁用不能点的原因及解决方案

Qt Creator 下载地址&#xff08;含历史版本&#xff09;&#xff1a;https://download.qt.io/official_releases/qtcreator/ 症状 Qt Creator 目前最新版为12.0.1&#xff0c;安装后打开.qml文件发现设计工具图标为禁用状态。 原因及解决方案 根据官网材料&#xff08;Qt C…