04 | 深入浅出索引(上)

此系列文章为极客时间课程《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.mzph.cn/news/876811.shtml

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

相关文章

强烈推荐java人,2024年大厂面试背这份(八股文+场景题结合)!很管用!

2024 年的行情,和 3~4 年前不同,通过海量简历投递和海量面试找工作的时代已经过去了。 在如今面试机会较少,并且面试难度较大的情况下。 充分做好面试的准备才是快速通过面试最有效的方法! 切忌把真实面试当靶场,最…

信息学奥赛初赛天天练-48-CSP-J2020完善程序2-变量交换、冒泡排序、贪心算法、最小区间覆盖

PDF文档公众号回复关键字:20240728 2020 CSP-J 完善程序2 1 完善程序 (单选题 ,每小题3分,共30分) 最小区间覆盖 给出 n 个区间,第 i 个区间的左右端点是 [ai,bi]。现在要在这些区间中选出若干个,使得区间 [0, m] 被所选区间的…

前端框架 element-plus 发布 2.7.8

更新日志 功能 组件 [级联选择器 (cascader)] 添加持久化属性以提升性能 (#17526 by 0song)[日期选择器 (date-picker)] 类型添加月份参数 (#17342 by Panzer-Jack)[级联选择器 (cascader)] 添加标签效果属性 (#17443 by ntnyq)[加载 (loading)] 补充加载属性 (#17174 by zhixi…

第九讲 后端1

后端(Backend) 用带噪声的数据估计内在状态(Estimated the inner state from noisy data)——状态估计问题渐进式(Incremental):保持当前状态的估计,在假如新信息时,更新…

【算法专题】双指针算法之18. 四数之和(力扣)

欢迎来到 CILMY23的博客 🏆本篇主题为:双指针算法之18. 四数之和(力扣) 🏆个人主页:CILMY23-CSDN博客 🏆系列专栏:Python | C | C语言 | 数据结构与算法 | 贪心算法 | Linux | 算…

ProxmoxPVE虚拟化平台--U盘挂载、硬盘直通

界面说明 ### 网络设置 ISO镜像文件 虚拟机中使用到的磁盘 挂载USB设备 这个操作比较简单,不涉及命令 选中需要到的虚拟机,然后选择: 添加->USB设置选择使用USB端口:选择对应的U盘即可 硬盘直通 通常情况下我们需要将原有…

【Linux 16】进程间通信的方式 - 共享内存

文章目录 🌈 一、共享内存概述⭐ 1. 什么是共享内存⭐ 2. 如何实现共享内存⭐ 3. 操作系统允许存在多个共享内存⭐ 4. 操作系统如何管理共享内存⭐ 5. 获取共享内存的唯一标识符 key⭐ 6. 为什么要由用户提供 key 🌈 二、查看共享内存⭐ 1. 使用 ipcs -m…

TCP 协议的 time_wait 超时时间

优质博文:IT-BLOG-CN 灵感来源 Time_Wait 产生的时机 TCP四次挥手的流程 如上所知:客户端在收到服务端第三次FIN挥手后,就会进入TIME_WAIT状态,开启时长为2MSL的定时器。 【1】MSL是Maximum Segment Lifetime报文最大生存时间…

root 用户和权限

目录 1. 超级管理员 root 2. 切换用户 Switch User 2.1 普通用户切换到 root 用户 2.2 root 用户切换到普通用户 3. sudo 命令 3.1 配置认证 无论是 Windows,MacOS,Linux 均采用多用户的管理模式管理权限; 1. 超级管理员 root 在 Li…

2年社招冲击字节,一天三面斩获offer

在工作满两年的时间选择了求变,带着运气和实力以社招身份重新看今天的互联网环境,从结果看还是复合预期的。 整个面试的流程还挺快的。周中让招聘专员给投递了简历。问什么时候面试,申请了一个周日,直接安排三面。下周周中就开启…

C#中的wpf基础

在WPF中,Grid 是一种非常强大的布局控件,用于创建网格布局。它允许你将界面划分为行和列,并将控件放置在这些行和列中。 以下是一些关键点和示例,帮助你理解 WPF 中的 Grid: 基本属性 RowDefinitions:定义…

[MIT6.5840]MapReduce

MapReduce Lab 地址 https://pdos.csail.mit.edu/6.824/labs/lab-mr.html 论文地址 https://static.googleusercontent.com/media/research.google.com/zh-CN//archive/mapreduce-osdi04.pdf 工作原理 简单来讲,MapReduce是一种分布式框架,可以用来处理…

windows 安装docker桌面版

下载 下载两个: git桌面版 docker desktop 启动docker 执行安装文件,启动 更新wsl2 假如报错,会提示失败原因。 win10会提示跳转到: https://learn.microsoft.com/zh-cn/windows/wsl/install-manual#step-4—download-the-l…

从0到1,AI我来了- (4)AI图片识别的理论知识-II

上篇文章,我们理解了我们程序的神经网络设计,这篇我们继续,把训练迭代过程分析一下,完成这两篇文章,下面问题,应该能回答了。 一张图片,如何被计算机读懂?pytorch 封装的网络&#…

DP 整数拆分不同的二叉搜索树 DAY21

整数拆分? 给定一个正整数 n ,将其拆分为 k 个 正整数 的和( k > 2 ),并使这些整数的乘积最大化。 返回 你可以获得的最大乘积。 示例 1: 输入: n 2 输出: 1 解释: 2 1 1, 1 1 1。示例 2: 输入: n 10 输…

全国区块链职业技能大赛样题第9套前端源码

后端源码地址:https://blog.csdn.net/Qhx20040819/article/details/140746050 前端源码地址:https://blog.csdn.net/Qhx20040819/article/details/140746216 智能合约+数据库表设计:https://blog.csdn.net/Qhx20040819/article/details/140746646 登录 ​ 用户管理

又一成就,Pencils Protocol单链 TVL 突破 3 亿美元

Pencils Protocol 是 Scroll 生态的原生项目,该项目以一站式收益聚合器和拍卖平台作为主要定位,在功能上,其集 Launchpad、资产统一聚合和分发、杠杆收益等功能于一体,旨在最大化用户的资产利用率。近日,Pencils Proto…

利用python自动化运维i脚本实现远程连接服务器并实现相应命令

目录 前言: 一.调用的python库介绍 二.在主机上安装好相应的库 2.1激活虚拟环境 三.代码实现以及解析 四.效果的实现 五.致谢 前言: 在当今快速发展的技术环境中,自动化运维已成为 IT 基础设施管理的关键组成部分。它不仅可以显著提…

Lua编程

文章目录 概述lua数据类型元表注意 闭包表现 实现 lua/c 接口编程skynet中调用层次虚拟栈C闭包注册表userdatalightuserdata 小结 概述 这次是skynet,需要一些lua/c相关的。写一篇博客,记录下。希望有所收获。 lua数据类型 boolean , number , string…

大模型算法面试题(十五)

本系列收纳各种大模型面试题及答案。 1、大模型LLM进行SFT如何对样本进行优化 大模型LLM(Language Model,语言模型)进行SFT(Structured Fine-Tuning,结构化微调)时,对样本的优化是提升模型性能…