索引的底层实现原理是什么?

news2025/1/21 4:58:34

索引存储在内存中,为服务器存储引擎为了快速找到记录的一种数据结构。索引的主要作用是加快数据查找速度,提高数据库的性能。

索引的分类

(1) 普通索引:最基本的索引,它没有任何限制。

(2) 唯一索引:与普通索引类似,不同的就是索引列的值必须唯一,但允许有空值。如果是组合索引,则列值的组合必须唯一。

(3) 主键索引:它是一种特殊的唯一索引,用于唯一标识数据表中的某一条记录,不允许有空值,一般用 primary key 来约束。

(4) 联合索引(又叫复合索引):多个字段上建立的索引,能够加速复合查询条件的检索。

(5) 全文索引:老版本 MySQL 自带的全文索引只能用于数据库引擎为 MyISAM 的数据表,新版本 MySQL 5.6 的 InnoDB 支持全文索引。默认 MySQL 不支持中文全文检索,可以通过扩展 MySQL,添加中文全文检索或为中文内容表提供一个对应的英文索引表的方式来支持中文。

1. 索引结构

索引是在Mysql的存储引擎(InnoDB,MyISAM)层中实现的, 而不是在服务层实现的. 所以每种存储引擎的索引都不一定完全相同, 也不是所有的存储引擎都支持所有的索引类型的, Mysql目前提供了以下4种索引:

B+Tree 索引: 最常见的索引类型, 大部分索引都支持B+树索引.

Hash 索引: 只有Memory引擎支持, 使用场景简单.

R-Tree索引(空间索引): 空间索引是MyISAM引擎的一个特殊索引类型, 主要地理空间数据, 使用也很少.

S-Full-text(全文索引): 全文索引也是MyISAM的一个特殊索引类型, 主要用于全文索引, InnoDB从Mysql5.6版本开始支持全文索引.
在这里插入图片描述
2. BTree结构

B+Tree是在BTree基础上进行演变的, 所以我们先来看看BTree, BTree又叫多路平衡搜索树, 一颗m叉BTree特性如下:

(1) 树中每个节点最多包含m个孩子.

(2) 除根节点与叶子节点外, 每个节点至少有[ceil(m/2)] 个孩子(ceil函数指向上取整).

(3) 若根节点不是叶子节点, 则至少有两个孩子.

(4) 每个非叶子节点由n个Key和n+1个指针组成, 其中 [ceil(m/2) -1 ] <= n <= m-1.

以5叉BTree为例, key的数量: 公式推导 [ceil(m/2) -1 ] <= n <= m-1.

所以 2 <= n <= 4, 中间节点分裂父节点,两边节点分裂.
在这里插入图片描述
3.B+Tree 结构

B+Tree为BTree的变种, B+Tree与BTree的区别:

1.B+Tree的叶子节点保存所有的key信息, 依key大小顺序排列.

2.B+Tree叶子节点元素维护了一个单项链表.

所有的非叶子节点都可以看作是key的索引部分。
在这里插入图片描述
由于B+Tree只有叶子节点保存key信息, 查询任何key都要从root走的叶子. 所以B+Tree查询效率更稳定.

Mysql中的B+Tree

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

MySql中的B+Tree索引结构示意图:
在这里插入图片描述

MySQL知识精讲+mysql实战案例_零基础mysql数据库入门到高级全套教程

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

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

相关文章

计算机毕设Python+Vue研究生培养过程管理系统(程序+LW+部署)

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

【SpringCloud-Eureka】Gateway网关

Gateway概念 特征 核心流程 Eureka服务注册 生产端 Gateway网关 验证网关 Gateway概念 路由&#xff08;Route&#xff09;是GateWay中最基本的组件之一&#xff0c;表示一个具体的路由信息载体&#xff0c;主要由下面几个部分组成&#xff1a; id&#xff1a;路由唯一标…

Cadence Allegro在PCB中手动或者自动添加差分对属性

设计PCB过程中&#xff0c;若设计中有差分对信号&#xff0c;则需要将是差分的2个信号设置为差分对&#xff0c;设置差分对有2种方式&#xff1a;手动添加及自动添加一、手动添加差分对&#xff1a;1、点击Setup-Constraints-Constraint Manager调出CM规则管理器&#xff0c;然…

GAN系列之动漫风格迁移AnimeGAN2

动漫是我们日常生活中常见的艺术形式&#xff0c;被广泛应用于广告、电影和儿童教育等多个领域。目前&#xff0c;动漫的制作主要是依靠手工实现。然而&#xff0c;手工制作动漫非常费力&#xff0c;需要非常专业的艺术技巧。对于动漫艺术家来说&#xff0c;创作高质量的动漫作…

项目分享 | MindSpore Insight AI可视化工具开发心得

01 概述 MindSpore Insight是昇思MindSpore的可视化调试调优工具。作为开发者&#xff0c;我参与了MindSpore Insight工具部分功能的开发。本文将对MindSpore Insight进行简要介绍、其次介绍在开发中所用开发框架Vue的响应式原理。 02 MindSpore Insight介绍 MindSpore Insig…

机器学习笔记之波尔兹曼机(二)梯度求解(正相、负相均采用MCMC)

机器学习笔记之波尔兹曼机——基于MCMC的梯度求解引言回顾&#xff1a;波尔兹曼机波尔兹曼机的结构表示模型参数的对数似然梯度基于MCMC梯度求解过程存在的问题关于单个变量的后验概率关于单个变量后验概率的推导过程单个变量后验概率与受限玻尔兹曼机引言 上一节介绍了波尔兹…

【Java基础知识复盘】基础语法篇

本人知识复盘系列的博客并非全部原创&#xff0c;大部分摘自网络&#xff0c;只是为了记录在自己的博客方便查阅&#xff0c;往后也会陆续在本篇博客更新本人查阅到的新的知识点&#xff0c;望悉知&#xff01; 基础语法 数据类型 定义 java语言是强类型语言&#xff0c;对于…

TiDB丨教你一招,实现MySQL与TiDB灵活切换

文章目录一、前言二、MySQL与TiDB切换方案1. 部署DM集群2. 添加数据源3. 创建同步任务三、 切换到 TiDB1、停止DM数据同步2、开启 Binlog 增量同步四、 故障切换回 MySQL五、总结一、前言 在日常工作中&#xff0c;原应用系统是跑在单机MySQL上&#xff0c;但随着业务量的慢慢…

读研转码,纠结技术方向

作者&#xff1a;阿秀校招八股文学习网站&#xff1a;https://interviewguide.cn这是阿秀的第「227」篇原创你好&#xff0c;我是阿秀。很多本科非科班的小伙伴都会选择通过读个研来达到转码的目的&#xff0c;主要是想给自己一个2-3年的缓冲时间。其中有的研究生专业是计算机的…

一文带你了解MindSpore的知识及安装入手

&#x1f51d;&#x1f51d;&#x1f51d;&#x1f51d;&#x1f51d;&#x1f51d;&#x1f51d;&#x1f51d;&#x1f51d;&#x1f51d;&#x1f51d;&#x1f51d;&#x1f51d;&#x1f51d;&#x1f51d; &#x1f947;博主昵称&#xff1a;Jovy. &#x1f35f;博客主页…

自动控制原理笔记-控制系统的数学模型

目录 建模方法 控制系统的数学模型——微分方程&#xff1a; 将方框图变为具体公式&#xff1a; 非线性系统微分方程的线性化&#xff1a; 线性定常微分方程的求解&#xff1a; 拉普拉斯变换的有关概念&#xff1a; 复数的有关概念&#xff1a; 拉氏变换的定义&#xf…

DolphinDB 分布式表数据更新原理和性能介绍

1. 概述 DolphinDB 从 1.30.6 版本开始支持更新分布式表数据。更新操作支持事务&#xff0c;具备事务 ACID 的特性&#xff0c;且通过 MVCC 实现快照隔离级别。DolphinDB 为多模数据库&#xff0c;目前支持两种存储引擎&#xff1a; OLAP 和 TSDB &#xff08;详见 DolphinDB …

xcode使用gdal库

GDAL(Geospatial Data Abstraction Library)是一个在X/MIT许可协议下的开源栅格空间数据转换库。它利用抽象数据模型来表达所支持的各种文件格式。它还有一系列命令行工具来进行数据转换和处理。 GDAL提供对多种栅格数据的支持&#xff0c;包括Arc/Info ASCII Grid(asc)&#…

4 个分析 GameFi 项目的工具

Nov. 2022, Vincy 区块链游戏通常有几种 token、几十种类别的 NFT&#xff0c;以及复杂的奖励机制来吸引和留住玩家。同时添加机器人和清洗交易&#xff0c;使得准确评估特定项目的有机利益和潜力变得具有挑战性。 这就是为什么在投入时间和金钱之前分析 GameFi 项目的基础数…

Linux中的Rsync备份服务

目录 一、备份基本概述 1.备份的定义 2.备份的原因 3.备份分类 &#xff08;1&#xff09;完全备份 &#xff08;2&#xff09;增量备份 4.实现备份工具 二、Rsync——远程同步 1.Rsync基本介绍 2.Rsync同步模式 &#xff08;1&#xff09;推 &#xff08;2&#xf…

【Linux】项目自动化构建工具make / Makefile 及进度条小程序

​&#x1f320; 作者&#xff1a;阿亮joy. &#x1f386;专栏&#xff1a;《学会Linux》 &#x1f387; 座右铭&#xff1a;每个优秀的人都有一段沉默的时光&#xff0c;那段时光是付出了很多努力却得不到结果的日子&#xff0c;我们把它叫做扎根 目录&#x1f449;make项目管…

关于对死锁的理解

文章目录什么是死锁&#xff1f;举例理解死锁如何解决死锁锁池与等待池的理解什么是锁池与等待池锁池与等待池的区别两个线程交替执行什么是死锁&#xff1f; 所谓死锁&#xff0c;是指互斥锁标记使用不当造成多个线程&#xff0c;相互持有对方想要申请的资源&#xff0c;不释…

HummerRisk V0.7.0:支持京东云、webhook、PDF下载等

HummerRisk V0.7.0发布&#xff1a;新增京东云支持&#xff0c;系统增加webhook支持&#xff0c;灵活扩展&#xff0c;新增多种页面的PDF下载&#xff0c;新增主机的批量导入和Windows类型主机的检测支持。 感谢社区中小伙伴们的反馈&#xff0c;你们的认可是我们前进的动力。…

四旋翼无人机学习第16节--labview开发allegro的PAD与封装查询工具

文章目录1 前言2 使用展示(有labview软件)2.1 使用界面展示2.2 配置文件展示2.3 封装检索2.4 pad检索2.5 软件退出3 使用展示(无labview软件)4 源文件下载方式1 前言 在学习allegro过程中&#xff0c;设计封装需要先设计组成封装的PAD&#xff0c;也就是使用Padstack Editor工…

Linux学习-93-SELinux安全上下文操作

18.6 SELinux安全上下文查看方法 SELinux 管理过程中&#xff0c;进程是否可以正确地访问文件资源&#xff0c;取决于它们的安全上下文。进程和文件都有自己的安全上下文&#xff0c;SELinux 会为进程和文件添加安全信息标签&#xff0c;比如 SELinux 用户、角色、类型、类别等…