04 | 深入浅出索引(上)

news2024/11/19 19:23:43

此系列文章为极客时间课程《MySQL 实战 45 讲》的学习笔记!

索引的常见模型

可以提供查询效率的数据结构有很多,常见的有三种:哈希表、有序数组、搜索数。

  • 哈希表是一种以 key-value 形式存储的数据结构。输入一个 key,通过固定的哈希算法,计算出这个 key 存储在数组的位置,若多个 key 计算的位置相同(也就是hash冲突),则用链表存储。这种数据结构的弊端是范围查找的效率非常低,需要全部扫描。哈希表这种结构适用于只有等值查询的场景。
  • 有序数组中存储的数据是按照顺序依次存储的数据中,它在等值查询和范围查询中都是非常高效的。但是一旦涉及到更新或者新增时,效率就变得非常低,因为需要移动数组中的元素,以便满足有序。所以,有序数组索引只适用于静态存储引擎,比如你要保存的是 2017 年某个城市的所有人口信息,这类不会再修改的数据。
  • 搜索数既能解决查询问题,又能解决更新问题,而且多叉搜索数还可以降低IO 磁盘的交互,从而提升查询效率。

InnoDB 的索引模型

在 MySQL 的InnoDB 存储引擎中,索引使用的是 B+ 树的存储结构,这种结构的特点是非叶子节点存储的是索引值,这样可以尽量使每个数据页存储最多的索引,叶子节点存储的是索引值对应的那一行数据。并且叶子节点之间是用双向链表连接的,且是按照顺序连接,这样就可以做范围查找。

InnoDB 中的索引分为主键索引(聚簇索引)和非主键索引(二级索引)。

  • 主键索引的叶子节点存的是整行数据。在 InnoDB 里,主键索引也被称为聚簇索引(clustered index)。
  • 非主键索引的叶子节点内容是主键的值。在 InnoDB 里,非主键索引也被称为二级索引(secondary index)。

在这里插入图片描述

那么基于主键索引的查询和基于普通索引的查询有什么区别呢?
如果语句是 select * from T where ID=500,即主键查询方式,则只需要搜索 ID 这棵 B+ 树;
如果语句是 select * from T where k=5,即普通索引查询方式,则需要先搜索 k 索引树,得到 ID 的值为 500,再到 ID 索引树搜索一次。这个过程称为回表

索引维护

建立索引可以有效的提升查询效率,但是会不可避免的带来索引维护问题。

比如上面的图中我们添加一条 ID 是 700 的数据,则直接在 R5 的后面添加即可,此时的效率影响不大,但是要新增一条 ID 是 400 的数据,就需要在 R3 和 R4 中间添加了,这时若这个数据页满了,就会有页分裂的情况,就是产生一个新的数据页,将原数据页的一部分数据移动到新的数据页,此时数据页的利用率就低了。那么在删除数据时,若数据页的数据很少,且相邻数据也的数据也不多时,就会合并两个数据页,节省空间,这个过程叫做页分裂的逆向过程

所以我们在日常创建数据库表的时候,建议主键自增,这样每次添加数据就不会产生页分裂了。

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

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

相关文章

Markdown使用~~pandoc插件安装

目录 1.两大秘密武器 2.vscode创作 3.Typora的安装 4.pandoc安装 4.1百度网盘 4.2按照说明安装 4.3到达github里面下载 4.4选择对应版本 4.5进入偏好设置 4.6对于导出的路径进行配置 5.Typora和vscode的对比 6.如何正确的学习这个Typora软件 7.一点相关的说明 1.两…

做一个能和你互动玩耍的智能机器人之三

内容节选自英特尔的开源项目openbot的body目录下diy下的readme,这是一个组装和连线方式的说明文档,接线需要配合firmware固件使用,固件代码的接线柱是对应的。 body目录内部十分丰富,主要介绍了这个项目的背景和硬件以及如何让他…

datawhale逻辑推理赛题01

跟着datawhale参加了逻辑推理赛题,这个是一个大模型比赛入门非常好的比赛,可以帮助我们更快的上手大模型相关的业务 我参加的是天池的这个比赛,跟着datawhale官方的baseline01已经上分0.6498,是一个非常好的开始 后续我讲继续跟着…

java项目中添加SDK项目作为依赖使用(无需上传Maven)

需求: 当需要多次调用某个函数或算法时,不想每次调用接口都自己编写,可以将该项目打包,以添加依赖的方式实现调用 适用于: 无需上线的项目,仅公司或团队内部使用的项目 操作步骤: 以下面这…

Linux---进程(2)

目录 查看进程 查看进程pid 系统目录查看 理解当前工作目录用途 fork创建进程 存在问题 问题解决 问题一 问题二 本文介绍进程标识符的相关知识以及创建子进程。 查看进程 指令就是可执行程序,每次运行时,都需要被加载到内存,运行…

动物之森-小红书2024笔试(codefun2000)

题目链接 动物之森-小红书2024笔试(codefun2000) 题目内容 塔子哥最近在玩一款叫做“动物之森”的四字开放游戏世界。由于塔子哥氪金了,所以他在游戏中拥有很多个宝箱,每个宝箱里都装着一些他收集的宝石。每一种类型的宝石都有不同的作用。 有一天&…

java--jvm虚拟机(都是要点)

请带着以下问题,学习并理解jvm 问题一: 为什么fullGC会对系统性能有影响?youngGC却几乎没有? 问题二: outofmemory是什么异常?什么时候会出现?如何处理? 问题三: 线程…

鸿蒙 HarmonyOS NEXT端云一体化开发-云函数篇

前言 TODO:新建项目和应用,开通云函数服务(AGC)端侧开发:Arkts界面开发云测开发:云函数、认证服务、云存储、云数据库 一、登录 地址:https://id1.cloud.huawei.com/CAS/portal/loginAuth.htm…

Nginx周末部署

背景 Nginx是本人学习的一类中间件,上次完成了vue的搭建,所以顺便把项目加入Nginx吧 1. 镜像拉取与测试 查询dockerHub,选择最新最稳定的版本 docker pull nginx:stable-perl 执行下载 docker run -d --name mynginx -p 8080:80 -v D:\IM…

【Kubernetes】配置管理(一):ConfigMap

配置管理(一):ConfigMap 1.配置管理2.使用 ConfigMap 管理 Pod 的配置信息2.1 创建 ConfigMap2.1.1 在命令行中通过指定 ConfigMap 的参数进行创建2.1.2 通过指定的配置文件创建 ConfigMap2.1.3 通过一个文件内的多个键值对创建 ConfigMap2.1…

C++数据结构重要知识点(3)(红黑树及其插入操作)

1.红黑树和AVL树的区别 红黑树和AVL树都是平衡树,都是为了解决二叉搜索树的劣势。其中,AVL树的左右子树的高度差不超过1,而红黑树的最长路径不超过最短路径的二倍,也就是说,红黑树是一种近似平衡,而AVL树是…

【设计模式】(万字总结)深入理解Java中的创建型设计模式

1. 前言 在软件开发的世界里,设计模式是一种被广泛接受并应用的解决方案。它们不仅仅是代码的设计,更是对问题的思考和解决的方法论。在Java开发中,特别是在面向对象的编程中,设计模式尤为重要。创建型设计模式,作为设…

JavaScript安全编程宝典【万字详解】

文章目录 简介基本说明特点两种使用方式在script中写使用script标签引入JS文件 数据类型介绍特殊值 运算符算数运算符赋值运算符逻辑运算符:条件运算符 数组的定义基本使用数组的遍历 函数含义函数定义方式基本语法代码示例 细节和注意事项 自定义对象Object形式{} …

解决mysql数据库表读取中文乱码问题

本文目录 0、省流1、问题出现2、问题排查3、结论 0、省流 在服务器上创建数据库服务时,使用的sql脚本加载的数据库表,其中脚本中有一些预设的测试数据包含中文汉字,由于linxu服务器控制台默认编码是lantin1,导致中文通过该编码方…

鸿蒙HarmonyOS开发:多种内置弹窗及自定义弹窗的详细使用指南

文章目录 一、消息提示框(showToast)1、导入模块2、语法3、参数4、示例5、效果 二、对话框(showDialog)1、导入模块2、语法3、参数4、示例5、效果 三、警告弹窗(AlertDialog)1、语法2、参数3、AlertDialogP…

JDBC(Java访问数据库)

Java Database Connectivity:Java访问数据库的解决方案 JDBC定义了一套标准接口,即访问数据库的通用API, 不同的数据库厂商根据各自数据库的特点去实现这些接口。 JDBC希望用相同的方式访问不同的数据库,让具体的数据库操作与数…

科普文:科普文:springcloud之-Hystrix服务容错

Hystrix概念 Hystrix 服务容错保护 的概念和说明 这就是大名鼎鼎的:豪猪 豪猪的英文就是:Hystrix,国外一些大牛的程序员在给自己的架构起名字的时候,往往就这么特别。哪天咱们中国人自己也能写出些架构,咱们就按照中…

⚒linux通过shell脚本上传文件至minio中

🔴大家好,我是雄雄,欢迎关注微信公众号:雄雄的小课堂 前言 之前数据库是备份到了七牛云上了,但是眼看着数据库文件越来越大,七牛云里面的余额越来越少,所以,转移阵地。 家里的nas&…

昇思25天学习打卡营第20天|munger85

GAN图像生成 生成对抗网络中是为了让我们生成的东西向期望的那样,就是为了让生成的东西很像,真的,例如用它来画画。就是描述整个网络的逻辑和目的,它有两部分组成,一个是生成器,一个是辨别器。他希望的是辨…

C++程序编程中的 SetWindowLong 函数的几个常见用途(附源码)

目录 1、API函数SetWindowLong说明 2、修改窗口风格 3、给窗口指定新的窗口消息处理函数,以拦截窗口消息 4、可以给窗口设置关联的UserData数据,方便在窗口内部使用这些数据 5、64位程序中需要使用SetWindowLongPtr 6、最后 C++软件异常排查从入门到精通系列教程(专栏…