mysql-索引笔记

news2024/11/24 15:55:32

索引

1、什么是索引

  • 索引是对数据库中数据的一种结构化表示。它像一本书的目录,能够快速定位信息,而无需逐行扫描所有数据。

  • 索引的出现其实就是为了提高数据查询的效率,就像书的目录一样。

2、索引的常见模型

2.1.哈希表

用一个哈希函数把 key 换算成一个确定的位置,然后把 value 放在数组的这个位置。我们只要输入待查找的key,就可以找到其对应的值即 Value。

举例:当我们要根据用户身份证号查用户名时,哈希表索引就是通过哈希函数算出身份证号对应的数组位置,然后得到用户名的。

图源:04 | 深入浅出索引(上)-MySQL 实战 45 讲-极客时间 (geekbang.org)

  • 适用于只有等值查询的场景

  • 做区间查询的速度是很慢的

2.2.有序数组

 图源:04 | 深入浅出索引(上)-MySQL 实战 45 讲-极客时间 (geekbang.org)

  • 适合范围查询(如上图,该有序数组是根据身份证号大小递增存储的,如果我们范围搜索身份证号则速度很快)

  • 更新数据麻烦,因为数组插入一个元素需要移动后面所有的元素。

2.3.搜索树

2.3.1.二叉搜索树
  • 二叉树是搜索效率最高的

  • 因为二叉树较高,读磁盘的次数多,导致查询速度慢

2.3.2.多叉搜索树
  • 读磁盘的次数少,因此查询速度快

3、InnoDB 的索引模型

在 MySQL 中,索引是在存储引擎层实现的,因此不同的存储引擎实现的索引底层的索引模型不同。在这里我们介绍InnoDB实现的索引底层的索引模型是怎样的。

InnoDB 使用了 B+ 树索引模型实现索引。每一个索引在 InnoDB 里面对应一棵 B+ 树。

4、索引类型

索引类型分为主键索引和非主键索引。

  • 主键索引的叶子节点存的是整行数据。

  • 非主键索引的叶子节点内容是主键的值。

基于主键索引和非主键索引的查询有什么区别?

  • 如果语句是 select * from T where ID=500,即主键查询方式,则只需要搜索 ID 这棵 B+ 树;

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

5、索引维护

B+ 树为了维护索引有序性,在插入新值的时候需要做必要的维护。在维护的过程中可能出现页分裂页合并,会影响性能。

为了避免出现页分裂和页合并,我们希望尽可能使用自增主键。

5.1.什么是自增主键?

  • 主键:主键是一个表中的字段,它的值能够唯一标识表中的每一行数据,

  • 自增:每当新记录被插入到表中时,自增主键会自动加一,生成新的唯一值。

5.2.使用自增主键的好处?

  • 不会触发叶子节点的分裂。每次插入一条新记录,都是追加操作,不涉及到挪动其他记录。

  • 占用存储空间相对较小。每个非主键索引的叶子节点上都是主键的值。主键占用的空间越小,普通索引的叶子节点就越小,普通索引占用的空间也就越小。

5.3.什么场景适合用业务字段直接做主键?

  • 只有一个索引:由于没有其他索引,所以也就不用考虑其他索引的叶子节点大小的问题。

  • 该索引必须是唯一索引:因为主键是唯一标识每行数据的,因此需要是唯一索引。

6、索引使用

6.1.覆盖索引

当数据库执行查询时,如果可以从覆盖索引中获取所需的所有数据,就不需要回表。意味着查询可以直接使用索引中的数据来返回结果,从而提高查询效率。

举例:select ID from T where k between 3 and 5,这时只需要查 ID 的值,而 ID 的值已经在 k 索引树上了,因此可以直接提供查询结果,不需要回表。这里的索引k就是覆盖索引。

6.2.最左前缀原则

最左前缀原则主要用于确定在使用联合索引时,查询条件中必须包含索引的最左侧列(即联合索引的第一列),才能有效地利用该索引。

举例:现在有一个联合索引(name,age),查询条件是"where name like ‘张 %’"。满足最左前缀原则,能有效利用这个联合索引。

建立联合索引的时候,如何安排索引内的字段顺序?

  • 第一原则是,如果通过调整顺序,可以少维护一个索引,那么这个顺序往往就是需要优先考虑采用的。

  • 第二考虑的原则就是空间。如果既有联合查询,又有基于 a、b 各自的查询,那么我们可以建立(a,b)、(b)索引或(b,a)、(a)索引。如果b的空间占用更大,那么则考虑建立(b,a)、(a)索引。

6.3.索引下推

索引下推指在索引查找过程中,尽可能多地将过滤条件(如 WHERE 子句中的条件)直接应用于索引,而不是在检索数据后再进行过滤。

举例:现在有联合索引(name, age),执行查询select * from tuser where name like '张%' and age=10;

因为查询条件name like '张%'满足最左前缀原则,因此在联合索引(name,age)上查询。

无索引下推执行流程:

1、在联合索引(name,age)上找到满足查询条件name like '张%'的所有行

2、依次回表查询获得完整数据

3、执行age=10的过滤。

索引下推执行流程:

1、在联合索引(name,age)上找到满足查询条件name like '张%'的所有行,并在这个过程中也检查 age=10 的条件。

2、依次回表查询获得完整数据

可以看出索引下推减少了回表的次数,提高了查询的速度。

参考

 04 | 深入浅出索引(上)-MySQL 实战 45 讲-极客时间 (geekbang.org)

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

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

相关文章

ChatGPT推出Canvas功能

"Canvas" 是 OpenAI 推出的全新界面,专为增强写作和编程协作而设计。它让用户能够在聊天之外更高效地进行编辑、审阅和反馈,提供了内联编辑、代码调试和文档版本控制等功能。目前,"Canvas" 已面向 ChatGPT Plus 和 Team …

Java进销存ERP管理系统源码

文章目录 1.项目介绍2.获取方式 1.项目介绍 主要模块:零售管理、采购管理、销售管理 仓库管理、财务管理、报表查询系统管理等。 支持预付款、收入支出 仓库调拨、组装拆卸、订单等特色功能 拥有库存状况、出入库 统计等报表 同时对角色和权限进行了细致全面控制&#xff0c…

【Spring】@RequestMapping、@RestController和Postman

文章目录 1.RequestMapping 注解介绍2. RequestMapping 使用3. RequestMapping 是 GET 还是 POST 请求?GET 请求POST 请求指定 GET/POST 方法类型 2. Postman 介绍1. 创建请求2. 传参介绍1. 普通传参2. form-data3. x-www-form-urlencoded form 表单,对应…

【深度学习】损失函数

损失函数(Loss Function)是机器学习和深度学习模型中的一个核心概念,它用于衡量模型的预测输出与真实标签之间的差异。通过优化(最小化)损失函数,模型可以不断调整其内部参数,提升预测性能。不同…

通信工程学习:什么是IP网际协议

IP:网际协议 IP网际协议(Internet Protocol,简称IP)是整个TCP/IP协议栈中的核心协议之一,它负责在网络中传送数据包,并提供寻址和路由功能。以下是对IP网际协议的详细解释: 一、对IP网际协议的…

Ubuntu安装Hadoop3.4

1、创建Hadoop用户 sudo adduser hadoop 将Hadoop加进sudo用户组,赋予更高权限: sudo usermod -G sudo hadoop 3、安装JDK(略) 查看JDK安装路径:which java 和 ls -al 3、配置SSH免密登录 在Hadoop分布式集群环境中,各个机器之间的通信通常需要使用SSH的方式进行连…

判断一个队列实例是否为空Queue.empty()

【小白从小学Python、C、Java】 【考研初试复试毕业设计】 【Python基础AI数据分析】 判断一个队列实例是否为空 Queue.empty() [太阳]选择题 根据给定的Python代码,哪个选项是错误的? import queue print("【执行】q queue.Queue()") …

react-问卷星项目(5)

实战 路由 路由设计,网址和页面的关系,就是从业务上分析需要哪些页面哪些页面内容可以抽离,业务流程要有入有出增加页面和Layout模版,模版就是抽离页面公共部分,比如都有顶部或者左侧导航,直接上代码&…

Solidity 设计模式:实现灵活与可扩展的智能合约架构

Solidity 作为以太坊智能合约的主要编程语言,拥有许多独特的设计模式,这些模式帮助开发者实现更加灵活、可扩展和安全的合约架构。设计模式不仅能够简化开发过程,还能减少常见的编程错误,并提高智能合约的可维护性和可升级性。本文…

舞动春日:SpringBoot打造古典舞在线交流平台

第四章 系统设计 4.1系统概要设计 本古典舞在线交流平台采用B/S结构来开发,这种结构是在互联网兴起后出现的,是一个适用于互联网环境下的模型结构,用户只要能上网通过浏览器就可以在任何时间、任何地点的使用。系统工作原理图如图4-1所示&…

华为OD机试 - 区间交叠问题 - 贪心算法(Python/JS/C/C++ 2024 E卷 200分)

华为OD机试 2024E卷题库疯狂收录中,刷题点这里 专栏导读 本专栏收录于《华为OD机试真题(Python/JS/C/C)》。 刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,…

二叉树的创建、遍历及销毁

头文件&#xff1a;link_tree.h #ifndef __LINK_TREE_H__ #define __LINK_TREE_H__ #include <stdio.h> #include <stdlib.h> typedef char datatype;//类型重定义 typedef struct tree_node {datatype data;//数据域&#xff0c;存储数据struct tree_node *left;…

【C++前缀和】1895. 最大的幻方|1781

本文涉及的基础知识点 C算法&#xff1a;前缀和、前缀乘积、前缀异或的原理、源码及测试用例 包括课程视频 LeetCode1895. 最大的幻方 难度分&#xff1a;1781 一个 k x k 的 幻方 指的是一个 k x k 填满整数的方格阵&#xff0c;且每一行、每一列以及两条对角线的和 全部相…

SpringBoot平台:古典舞爱好者的在线聚集地

第三章 系统分析 3.1 可行性分析 需要使用大部分精力开发的古典舞在线交流平台为了充分降低开发风险&#xff0c;特意在开发之前进行可行性分析这个验证系统开发是否可行的步骤。本文就会从技术角度&#xff0c;经济角度&#xff0c;还有操作角度等进行综合阐述。 3.1.1技术可行…

rkllm板端推理

交叉编译 在完成模型的量化构建后&#xff0c;就能够在目标硬件平台OK3576上实现模型的推理功能了。 板端推理的示例代码位于kllm-runtime/examples/rkllm_api_demo目录中&#xff0c;该目录提供了针对Android和Linux平台的编译示例。由于我们的开发环境是基于Linux的&#x…

程序猿成长之路之设计模式篇——设计模式简介

无论是对于代码质量还是代码可维护性、可扩展性&#xff0c;使用合适的设计模式都能够起到促进提升的作用&#xff0c;此外在软考的软件工程师、系统架构师职称考试中&#xff0c;设计模式也是必考的一块内容&#xff0c;因此我打算开拓一个新的专栏简单介绍一下设计模式&#…

数据仓库!企业决策的智慧引擎

数据仓库&#xff01;企业决策的智慧引擎 前言数据仓库 前言 今数字化浪潮汹涌澎湃的时代&#xff0c;数据已然成为企业航行于市场海洋的罗盘&#xff0c;而数据仓库则是那承载罗盘的坚固船只。当我们深入探究数据仓库的世界&#xff0c;就仿佛打开了一扇通往企业智慧核心的大…

Gazebo环境下开源UAV与USV联合仿真平台

推荐一个ROS2下基于Gazebo环境的开源UAV与USV联合仿真平台。平台是由两个开源项目共同搭建的。首先是UAV仿真平台&#xff0c;是基于PX4官方仿真平台&#xff08;https://docs.px4.io/main/en/sim_gazebo_gz&#xff09;&#xff1b;其次是USV仿真平台&#xff0c;是基于VRX仿真…

C++语言学习(4): identifier 的概念

1. 什么是 identifier identifier 中文意思是标识符&#xff0c;在 cppreference 中明确提到&#xff0c;identifier 是任意长度的数字、下划线、大写字母、小写字母、unicode 字符 的序列&#xff1a; An identifier is an arbitrarily long sequence of digits, underscores…