【MySQL实战45讲笔记】基础篇——深入浅出索引(上)

news2024/11/23 5:05:31

系列文章

基础篇——MySQL 的基础架构
基础篇——redo log 和 binlog
基础篇——事务隔离


目录

  • 系列文章
  • 深入浅出索引(上)
    • 4.1 索引的常见模型
    • 4.2 InnoDB 的索引模型
    • 4.3 索引维护
    • 4.4 思考:为什么要重建索引以及如何做?


深入浅出索引(上)

索引的出现其实就是为了提高数据查询的效率,就像书的目录一样。我们从小就用的汉语字典里面的声母查询方式就是聚簇索引, 偏旁部首就是二级索引,偏旁部首+笔画就是联合索引。同样,对于数据库的表而言,索引其实就是它的“目录”。

4.1 索引的常见模型

  1. 哈希表:它是一种以键 - 值(key-value)存储数据的结构。把值放在数组里,用一个哈希函数把 key 换算成一个确定的位置,然后把 value 放在数组的这个位置。如果多个 key 值经过哈希函数的换算,会出现了同一个值,处理这种情况的一种方法是,拉出一个链表。

    哈希表这种结构适用于只有等值查询的场景。因为在哈希表中,数据是根据它们的哈希值散列存储的,这意味着相邻的键值在物理上可能相隔很远。对于区间查询,这种无序性导致无法直接定位到查询区间的起始点和结束点(等值查询就是用等号来匹配查询结果,分为单条件查询、多条件查询,与等值查询对应的是模糊查询、范围查询)。

  2. 有序数组:在等值查询和范围查询场景中的性能就都非常优秀。使用二分法能够快速得到值,时间复杂度是O(log(N))。

    缺点是更新数据的成本高,所以有序数组索引只适用于静态存储引擎,比如要保存的是一些不会再修改的历史数据。

  3. 搜索树:树可以有二叉,也可以有多叉。搜索树的特点就是父节点的左子树所有节点的值小于父节点的值,右子树所有节点的值大于父节点的值。这种结构使得查找操作的时间复杂度可以保持在O(log(N))。

    大多数数据库存储不使用二叉树而是多叉搜索树比如B+树。因为索引不止存在内存中,还要写到磁盘上。二叉树比 n 叉树的高度更高,这就意味着需要更多的磁盘 I/O,时间更长。

4.2 InnoDB 的索引模型

InnoDB 使用了 B+ 树索引模型,所以数据都是存储在 B+ 树中的。每一个索引在 InnoDB 里面对应一棵 B+ 树。

根据叶子节点的内容,索引类型分为主键索引和非主键索引

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

在查询方面,假设,我们有一个主键列为 ID 的表,表中有字段 k,并且在 k 上有索引。

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

所以,使用非主键索引查询可能会触发回表,因为非主键索引的B+树中只存储着数据的主键索引(上面例子里的ID),我们需要用ID在到主键索引的B+树中查询一遍,找到完整的数据。

4.3 索引维护

B+ 树为了维护索引有序性,在插入新值的时候需要做必要的维护。

因此推荐使用自增主键(NOT NULL PRIMARY KEY AUTO_INCREMENT

  • 从性能角度:自增主键的插入数据模式,正符合了递增插入的场景。这种情况下每次插入一条新记录,都是追加操作,都不涉及到挪动其他记录,也不会触发叶子节点的分裂。而有业务逻辑的字段做主键,则往往不容易保证有序插入,这样写数据成本相对较高。

  • 从存储空间角度:主键长度越小,普通索引的叶子节点就越小,普通索引占用的空间也就越小。

当然也有些场景适合用业务字段直接做主键:

  1. 只有一个索引;
  2. 该索引必须是唯一索引。

这就是典型的KV 场景,这种场景下的数据被存储为键和值之间的映射,适用于只需要通过一个唯一键来访问特定值的场合。

因为没有其他索引,所以不用考虑非聚簇索引(二级索引)空间占用大小问题,并且也不用考虑回表的问题

4.4 思考:为什么要重建索引以及如何做?

当我我们删除了表中的一些行时,这些行只是被标记为“已删除”,而不是真的从索引中物理删除了,因而空间也没有真的被释放回收。 InnoDB的Purge线程会异步的来清理这些没用的索引键和行,但是依然没有把这些释放出来的空间还给操作系统重新使用,因而会导致页面中存在很多空洞。

重建索引是将原始索引在磁盘和内存中都删除,再根据原始数据建立索引,可以将原始索引中由于页分裂等原因造成的数据页的利用率低的问题解决 提高页利用率。

如果要重建一个普通索引k ,可以用下面两个 SQL 语句:

alter table T drop index k;
alter table T add index(k);

但是如果是重建一个主键,就不能通过上面两个命令,因为。不论是删除主键还是创建主键,都会将整个表重建。所以连着执行这两个语句的话,第一个语句就白做了。所以这两个语句,可以用这个语句代替 :

alter table T engine=InnoDB

下面是本篇的思维导图以供参考:

在这里插入图片描述

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

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

相关文章

技术美术百人计划 | 《2.1 色彩空间介绍》笔记

总览 一、色彩发送器 色彩认知: 光源是出生点,光源发射出光线,光线通过直射反射折射等路径最终进入人眼。 但人眼接收到光线后,人眼的细胞产生了一系列化学反应。 由此把产生的信号传入大脑,最终大脑对颜色产生了认…

无插件H5播放器EasyPlayer.js视频流媒体播放器如何开启electron硬解码Hevc(H265)

在数字化时代,流媒体播放器技术正经历着前所未有的变革。随着人工智能、大数据、云计算等技术的融合,流媒体播放器的核心技术不断演进,为用户提供了更加丰富和个性化的观看体验。 EasyPlayer.js H5播放器,是一款能够同时支持HTTP、…

Cannal实现MySQL主从同步环境搭建

大家好,我是袁庭新。 在多数情况下,客户端往往会优先获取缓存中的数据。然而,当缓存数据与数据库中的实际数据存在显著不一致时,可能会导致严重的后果。因此,确保数据库与缓存数据之间的一致性变得至关重要&#xff0c…

机器学习基础06

目录 1.梯度下降 1.1梯度下降概念 1.2梯度下降公式 1.3学习率 1.4实现梯度下降 1.5API 1.5.1随机梯度下降SGD 1.5.2小批量梯度下降MBGD 1.6梯度下降优化 2.欠拟合过拟合 2.1欠拟合 2.2过拟合 2.3正则化 2.3.1L1正则项(曼哈顿距离) 2.3.2…

探索ASP.NET Core 6 MVC与SqlServer的完美结合:一个开源示例项目

探索ASP.NET Core 6 MVC与SqlServer的完美结合:一个开源示例项目 【下载地址】ASP.NETCore6MVCSqlServer示例项目 ASP.NET Core 6 MVC SqlServer 示例项目本仓库提供了一个基于 ASP.NET Core 6 的 MVC 应用程序示例,使用 SqlServer 数据库 项目地址: …

LLM | 论文精读 | CVPR | Alpha-CLIP —— 一个聚焦目标区域的CLIP模型

论文标题:Alpha-CLIP: A CLIP Model Focusing on Wherever You Want 作者:Zeyi Sun, Ye Fang, Tong Wu, Pan Zhang, Yuhang Zang等 期刊:CVPR 2024 DOI:http://arxiv.org/pdf/2312.03818v2 email:yuhan.huangwhu.ed…

MySQL 的 Change Buffer 是什么?它有什么作用?

MySQL 的 Change Buffer 是什么?它有什么作用? MySQL 是目前广泛使用的开源数据库管理系统,其中的 InnoDB 存储引擎凭借其高性能、高可靠性以及强大的事务支持,成为了默认的存储引擎。在 InnoDB 的众多优化机制中,Cha…

axios 请求跨域问题

文章目录 1. 使用场景2. 解决办法 1. 使用场景 ① 编写后端测试接口&#xff0c;Vue-CLI 的默认端口为 8080&#xff0c;所以为避免端口冲突&#xff0c;我们后端的端口号换成 8081。 ② 前端通过 axios 向后端服务发起请求。 <script> import axios from axios export…

VConsole——(H5调试工具)前端开发使用于手机端查看控制台和请求发送

因为开发钉钉H5微应用在手机上一直查看不到日志等&#xff0c;出现安卓和苹果上传图片一边是成功的&#xff0c;一边是失败的&#xff0c;所以找了这个&#xff0c;之前在开发微信小程序进行调试的时候能看到&#xff0c;之前没想到过&#xff0c;这次被人提点发现可以单独使用…

集合卡尔曼滤波(Ensemble Kalman Filter),用于二维滤波(模拟平面上的目标跟踪),MATLAB代码

集合卡尔曼滤波&#xff08;Ensemble Kalman Filter&#xff09; 文章目录 引言理论基础卡尔曼滤波集合卡尔曼滤波初始化预测步骤更新步骤卡尔曼增益更新集合 MATLAB 实现运行结果3. 应用领域结论 引言 集合卡尔曼滤波&#xff08;Ensemble Kalman Filter, EnKF&#xff09;是…

写给Vue2使用者的Vue3学习笔记

&#x1f64b;‍请注意&#xff0c;由于本人项目中引入了unplugin-auto-import的依赖&#xff0c;所以所有的代码示例中均未手动引入各种依赖库&#xff08;ref、reactive、useRouter等等&#xff09; 初始环境搭建 npm init vuelatest模板语法 插值 同 Vue2 <span>…

golang调用webview,webview2,go-webview2

go version go1.20 windows/amd64 先要了解一些第三方库 1、webview/webview 它是一个跨平台的轻量级的webview库&#xff0c;面向的是C/C&#xff0c;使用它可以构建跨平台的GUI。webview就是浏览器内核&#xff0c;在不同操作系统上是不同的库&#xff0c;比如在windows上…

【初阶数据结构篇】双向链表的实现(赋源码)

文章目录 须知 &#x1f4ac; 欢迎讨论&#xff1a;如果你在学习过程中有任何问题或想法&#xff0c;欢迎在评论区留言&#xff0c;我们一起交流学习。你的支持是我继续创作的动力&#xff01; &#x1f44d; 点赞、收藏与分享&#xff1a;觉得这篇文章对你有帮助吗&#xff1…

结合第三方模块requests,文件IO、正则表达式,通过函数封装爬虫应用采集数据

#引用BeautifulSoup更方便提取html信息&#xff1b;requests模块&#xff0c;发生http请求&#xff1b;os模块&#xff0c;文件写入import requests from bs4 import BeautifulSoup import os#当使用requests库发送请求时&#xff0c;如果不设置User - Agent&#xff0c;默认的…

开源许可协议

何同学推动了开源协议的认识&#xff0c;功不可没&#xff0c;第一次对开源有了清晰的认识&#xff0c;最宽松的MIT开源协议 源自OSC开源社区&#xff1a;何同学使用开源软件“翻车”&#xff0c;都别吵了&#xff01;扯什么违反MIT

【达梦数据库】主备集群改造成读写分离

目录 背景步骤1、确认授权2、参数修改3、确认驱动版本和数据库版本匹配 背景 客户在双机主备集群手动切换的环境下&#xff0c;发现主库压力较大&#xff0c;需要改成读写分离的模式&#xff0c;将主库的压力分担到备库。 步骤 1、确认授权 select * from v$license;授权使…

docker安装zabbix +grafana

安装zabbix grafana 1、部署 mkdir -p /opt/zabbix/{data,backups}mkdir -p /opt/grafanasudo chown -R 472:472 /opt/grafanasudo chmod -R 755 /opt/grafanacat > docker-compose.yml <<-EOF version: 3.3services:mysql-server:image: mysql:8.1container_name: m…

RocketMQ学习记录

服务器操作系统版本&#xff1a;Ubuntu 24.04 Java版本&#xff1a;21 Spring Boot版本&#xff1a;3.3.5 如果打算用GUI&#xff0c;虚拟机安装Ubuntu 24.04&#xff0c;见虚拟机安装Ubuntu 24.04及其常用软件(2024.7)_ubuntu24.04-CSDN博客https://blog.csdn.net/weixin_4…

网络安全之接入控制

身份鉴别 ​ 定义:验证主题真实身份与其所声称的身份是否符合的过程&#xff0c;主体可以是用户、进程、主机。同时也可实现防重放&#xff0c;防假冒。 ​ 分类:单向鉴别、双向鉴别、三向鉴别。 ​ 主题身份标识信息:密钥、用户名和口令、证书和私钥 Internet接入控制过程 …

Spring 框架七大模块(Java EE 学习笔记03)

​ ​核心容器模块&#xff08;Core Container&#xff09; 核心容器模块在Spring的功能体系中起着支撑性作用&#xff0c;是其他模块的基石。核心容器层主要由Beans模块、Core模块、Contex模块和SpEL模块组成。 &#xff08;1&#xff09;Beans模块。它提供了BeanFactory类&…