<MySQL> 什么是数据库索引?数据库索引的底层结构是什么?
目录
一、什么是数据库索引?
1.1 索引的概念
1.2 索引的特点
1.3 索引的适用场景
1.4 索引的使用
1.4.1 创建索引
1.4.2 查看索引
1.4.3 删除索引
二、数据库索引的底层结构是什么?
2.1 数据库中的 B+树 长啥样?
2.2 B+树为什么适合做数据库索引的底层结构?
一、什么是数据库索引?
1.1 索引的概念
索引(index),与数组下标表示数组中元素的索引值相似,数据库索引也表示了数据表中数据的引用指针,这个指针指向数据表中对应的数据。
可以对数据表中的一列或多列数据创建索引。索引起到类似“书籍目录”的作用,可以用于快速定位和检索数据,对提高数据库性能有较大帮助。
1.2 索引的特点
| (1)可以加快查询速度 |
| 在不使用进行数据库查询时,需要遍历数据来得到查询结果。但是数据库存储介质是硬盘,而不是内存,硬盘的读写比内存慢很多。因此,如果需要提高数据库的查询速度,那么使用索引查询,搭配条件语句筛选数据,减少数据规模,减少硬盘的读写,是一个有效的方式。 |
| (2)索引本身也占据存储空间 |
| 索引本身也是数据,存储索引也需要占用存储空间。 |
| (3)会产生额外的开销 |
| 数据库数据在进行增、删、改时,也需要针对索引进行更新,这就会产生额外的开销。 |
1.3 索引的适用场景
如果数据表中的某列或多列符合以下条件,则可以考虑创建索引以提高查询效率:
| (1)数据量大,查询频高 |
| (2)增、删、改操作频率低 |
| (3)存储空间充足 |
如果不符合以上的条件,创建索引反而可能会拖累数据库的运行效率,此时则不考虑创建索引。
1.4 索引的使用
1.4.1 创建索引
| 创建方式 | 说明 |
| 自动创建 | 在使用主键约束(primary key)、唯一约束(unique)、外键约束(foreign key)时,会自动创建对应列的索引。 |
| 手动创建 | 使用 create index 索引名 on 表名(列名) 的语法进行创建。 |
如果存在大量数据,手动创建索引时则应考虑到触发大量硬盘IO的问题,这将导致服务器在完成该创建语句之前,无法响应其他的操作请求。

1.4.2 查看索引
| 语法 | show index from 表名; |
| 释义 | 展示指定表中的索引。 |

1.4.3 删除索引
| 语法 | drop index from 表名; |
| 释义 | 删除指定表中指定列的索引。 |

二、数据库索引的底层结构是什么?
索引是通过额外的数据结构,针对数据表中的数据进行重新组织。索引保存的数据结构主要为B+树,及hash的方式。
2.1 数据库中的 B+树 长啥样?

2.2 B+树为什么适合做数据库索引的底层结构?
简述B+树的部分特点:
| B+树的特点 | (1)B+树是一棵N叉搜索树,每个节点包含N个KEY,N个KEY划分出N个区间; |
| (2)每个节点的N个KEY值中,有区间内最大值(或最小值); | |
| (3)每个节点中的KEY都会在子树中重复出现; | |
| (4)最终树的叶子节点之间会使用链式结构相连; |
由以上特点可以得出,使用B+树作为数据库索引底层结构存在以下优点:
| (1)避免了查询数据时对树的回溯。 由于每个节点中的KEY都会在子树中重复出现,因此树的叶子节点就是数据的全集。将数据全集使用链式结构连接。此时对数据进行范围查找,则只需要查询一次根节点到叶子节点,再从叶子节点沿着链表向后查找即可,避免了子节点回溯父节点这一复杂过程。 |
| (2)稳定的查询时间。 查询任何元素,从根节点到叶子节点的距离是一致的。这意味着每次查询调用硬盘IO的次数是固定的,查询时间稳定。 |
| (3)充分利用内存进行比较,大幅减少硬盘IO的调用次数。 数据行的数据只存储在叶子节点,而非叶子节点中只保存了KEY值。KEY值只是索引,数据内存占用小,通常可以缓存到内存中,再进行内存比较。内存比较要比调用硬盘IO进行比较效率高许多个数量级,明显提高了查询效率,降低了开销。 |
阅读指针 -> 《MySQL--什么是数据库事务?事务该如何使用?》
链接生成中..........
相关文章:
<MySQL> 什么是数据库索引?数据库索引的底层结构是什么?
目录 一、什么是数据库索引? 1.1 索引的概念 1.2 索引的特点 1.3 索引的适用场景 1.4 索引的使用 1.4.1 创建索引 1.4.2 查看索引 1.4.3 删除索引 二、数据库索引的底层结构是什么? 2.1 数据库中的 B树 长啥样? 2.2 B树为什么适合做数据库索…...
对于koa中间件的理解
洋葱模型 大家都知道koa是洋葱模型,先一层一层通过next往下,之后再回去执行next后面的内容,next即使没写,最后也会进入下一个中间件。 那么什么是ctx呢,ctx顾名思义就是上下文,也就是上一层传给下一层的东…...
分页文件pagefile.sys引出的疑问
现象描述: 磁盘中显示无任何文件,却占用5GB左右的磁盘空间;格式化D盘时提示【此驱动器正在使用中。另一个程序或进程正在使用此驱动器。是否仍要对其进行格式化?】,点击【是】提示【Windows 无法完成格式化。】&#…...
【开题报告】疫苗在线预约小程序的设计与实现
1.选题背景 (1)新冠疫情下的疫苗接种挑战: 针对当前全球范围内的新冠疫情,疫苗接种成为控制疫情蔓延的重要手段。然而,大规模疫苗接种也带来了接种排队、人群聚集等管理难题,为了更好地组织和管理疫苗接种…...
【深度学习实验】注意力机制(二):掩码Softmax 操作
文章目录 一、实验介绍二、实验环境1. 配置虚拟环境2. 库版本介绍 三、实验内容0. 理论介绍a. 认知神经学中的注意力b. 注意力机制: 1. 注意力权重矩阵可视化(矩阵热图)2. 掩码Softmax 操作a. 导入必要的库b. masked_softmaxc. 实验结果 …...
idea运行项目之后一直卡在Writing classes… 解决方案
最近遇到idea里直接运行一个Spring boot项目后,idea一直慢悠悠的parsing java,然后就writing classes,然后就一直卡着不动了,运气好10几分钟能把项目启动起来。 多年的摸鱼经验告诉我,事出反常必有妖,赶紧…...
CentOS7 安装mysql8(离线安装)postgresql14(在线安装)
注:linux系统为vmware虚拟机,和真实工作环境可能有出入,不过正因如此我暴露了NAT转出的IP也没什么大碍 引言 postgresql与mysql目前都是非常受人欢迎的两大数据库,其各有各的优势,初学者先使用简单一张图来说明两者区…...
使用vant list实现订单列表,支持下拉加载更多
在公司项目开发时,有一个需求是实现可以分页的订单列表,由于是移动端项目,所以最好的解决方法是做下拉加载更多。 1.在页面中使用vant组件 <van-listv-model"loading":finished"finished"finished-text"没有更…...
OpenCV快速入门:图像形态学操作
文章目录 前言一、图像形态学基础1.1 背景介绍1.2 像素距离1.2.1 什么是像素距离?1.2.2 常见的像素距离度量方法1.2.3 计算像素距离的代码实现 1.3 图像连通性1.3.1 什么是图像连通性?1.3.2 连通类型1.3.3 连通组件标记1.3.4 连通性在图像处理中的应用 1…...
Scrapy----Scrapy简介
文章目录 概述与应用背景架构和组件功能和特点社区生态概述与应用背景 Scrapy,一个高效、灵活、且强大的Web爬取框架,被广泛应用于数据抓取和网页内容的结构化提取。它是用Python编写的,支持多平台运行,适用于数据挖掘、在线零售信息收集、历史数据存档等多种场景。Scrapy…...
基环树(pseudotree)入门
目录 无向基环树找环,[题目](https://www.luogu.com.cn/problem/P8655)拓扑排序找环并查集找环dfs找环 内向基环树[2876. 有向图访问计数](https://leetcode.cn/problems/count-visited-nodes-in-a-directed-graph/description/)[2127. 参加会议的最多员工数](https…...
nrm的安装以及使用
1,什么是nrm nrm 是一个 npm 源管理器,允许你快速地在 npm源间切换。 什么意思呢,npm默认情况下是使用npm官方源(使用npm config ls命令可以查看),在国内用这个源肯定是不靠谱的,一般我们都会…...
Linux:补充一些常用命令
Linux:补充一些常用命令 1. free -h2. df -lh3. du -sh *4. uname -a5. which6. mvn install 编译打包7. find -name *.jar8. cd -9. nohup java -jar *.jar &10. ps -ef|grep java11. netstat -ntlp 1. free -h free 命令显示系统使用和空闲的内存情况&#x…...
Maven编译报错:javacTask: 源发行版 1.8 需要目标发行版 1.8
报错截图: IDEA中的jdk检查都正常设置的1.8一点毛病没有。参考其他帖子链接如下: https://blog.csdn.net/zhishidi/article/details/131480199https://blog.51cto.com/u_16213460/7197764https://blog.csdn.net/lck_csdn/article/details/125387878 逐…...
python批量为视频添加文字水印和图片水印的程序
如题,代码如下,可设置多个图片水印及它们的移动位置 功能为:可以添加多个动态移动的水印,还可以设置水印的大小以及移动速度,也可以增加文字水印,重点是这个是批量执行的,可以对目录下的所有视…...
使用 webpack 打包 express 应用
使用 webpack 打包 express 应用 安装 webpack 依赖 pnpm add webpack webpack-cli -D初始化配置 可以使用命令 webpack init 初始化配置或者直接自己创建 webpack.config.js 文件和增加 npm 脚本: 下面是 npm 脚本 和 webpack.config.js 配置: // G…...
深度学习——(生成模型)DDPM
前置数学知识 1、先验概率和后验概率 先验概率:根据以往经验和分析得到的概率,它往往作为“由因求果”问题中的“因”出现,如 q ( x t ∣ x t − 1 ) q(x_t|x_{t-1}) q(xt∣xt−1) 后验概率:指在得到“结果”的信息后重新修正的概率,是…...
uniapp如何使用api相关提示框
uni.showToast:用于显示一条带有图标的提示框。title:提示的内容。icon:图标,可选值包括 success、loading、none。duration:提示框持续时间(单位:毫秒),默认为1500。 un…...
在Java代码中指定用JAXB的XmlElement注解的元素的顺序
例如,下面的类RegisterResponse 使用了XmlRootElement注解,同时也使用XmlType注解,并用XmlType注解的propOrder属性,指定了两个用XmlElement注解的元素出现的顺序,先出现flag,后出现enterpriseId࿰…...
LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明
LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造,完美适配AGV和无人叉车。同时,集成以太网与语音合成技术,为各类高级系统(如MES、调度系统、库位管理、立库等)提供高效便捷的语音交互体验。 L…...
观成科技:隐蔽隧道工具Ligolo-ng加密流量分析
1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具,该工具基于TUN接口实现其功能,利用反向TCP/TLS连接建立一条隐蔽的通信信道,支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式,适应复杂网…...
docker详细操作--未完待续
docker介绍 docker官网: Docker:加速容器应用程序开发 harbor官网:Harbor - Harbor 中文 使用docker加速器: Docker镜像极速下载服务 - 毫秒镜像 是什么 Docker 是一种开源的容器化平台,用于将应用程序及其依赖项(如库、运行时环…...
在rocky linux 9.5上在线安装 docker
前面是指南,后面是日志 sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo dnf install docker-ce docker-ce-cli containerd.io -y docker version sudo systemctl start docker sudo systemctl status docker …...
Go 语言接口详解
Go 语言接口详解 核心概念 接口定义 在 Go 语言中,接口是一种抽象类型,它定义了一组方法的集合: // 定义接口 type Shape interface {Area() float64Perimeter() float64 } 接口实现 Go 接口的实现是隐式的: // 矩形结构体…...
Vue2 第一节_Vue2上手_插值表达式{{}}_访问数据和修改数据_Vue开发者工具
文章目录 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染2. 插值表达式{{}}3. 访问数据和修改数据4. vue响应式5. Vue开发者工具--方便调试 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染 准备容器引包创建Vue实例 new Vue()指定配置项 ->渲染数据 准备一个容器,例如: …...
自然语言处理——Transformer
自然语言处理——Transformer 自注意力机制多头注意力机制Transformer 虽然循环神经网络可以对具有序列特性的数据非常有效,它能挖掘数据中的时序信息以及语义信息,但是它有一个很大的缺陷——很难并行化。 我们可以考虑用CNN来替代RNN,但是…...
Android Bitmap治理全解析:从加载优化到泄漏防控的全生命周期管理
引言 Bitmap(位图)是Android应用内存占用的“头号杀手”。一张1080P(1920x1080)的图片以ARGB_8888格式加载时,内存占用高达8MB(192010804字节)。据统计,超过60%的应用OOM崩溃与Bitm…...
算法笔记2
1.字符串拼接最好用StringBuilder,不用String 2.创建List<>类型的数组并创建内存 List arr[] new ArrayList[26]; Arrays.setAll(arr, i -> new ArrayList<>()); 3.去掉首尾空格...
tauri项目,如何在rust端读取电脑环境变量
如果想在前端通过调用来获取环境变量的值,可以通过标准的依赖: std::env::var(name).ok() 想在前端通过调用来获取,可以写一个command函数: #[tauri::command] pub fn get_env_var(name: String) -> Result<String, Stri…...
