秋招Day14 - MySQL - 索引

索引为什么能够提高MySQL的查询效率?

索引可以理解为目录,通过索引可以快速定位数据,避免全表扫描

一般是B+树结构,查找效率是O(log n)

索引还能加速排序、分组、连接等操作。

create index idx_name on students(name);

能简单说一下索引的分类吗?

功能上分,有主键索引、唯一索引、联合索引、前缀索引和全文索引。

数据结构上分,有B+树索引、哈希索引。

存储内容上分,有聚簇索引、非聚簇索引。

你对主键索引了解多少?

主键索引用于唯一标识表中的每条记录,其列值必须唯一且不为空。创建主键时会自动生成主键索引。

唯一索引和主键索引有什么区别?

主键索引 = 唯一索引 + 非空,每个表只能有一个主键索引,但是可以有多个唯一索引,唯一索引的列允许插入多个NULL值。

unique key和unique index有什么区别?

unique key是一种约束,创建唯一键时,MySQL会自动创建一个同名的唯一索引;反之,创建唯一索引也会隐式添加唯一性约束。

可通过 UNIQUE KEY uk_name 定义或者 CONSTRAINT uk_name UNIQUE 定义唯一键。

可通过 CREATE UNIQUE INDEX 创建唯一索引。

你对全文索引了解多少?

全文索引是一种优化文本数据检索的特殊类型索引,适用于CHAR、VARCHAR、TEXT 

建表时可以通过FULLTEXT INDEX index_name (title, body) WITH PARSER ngram定义

ngram是一种解析器,可以处理中文日文韩文分词

使用时用MATCH(title, content) AGAINST('+xxx -xxx' IN BOOLEAN MODE)

默认按降序返回结果,+标识必须包含,-表示必须排除,*表示通配符。

底层使用倒排索引将字段中的文本内容进行分词,然后建立一个倒排表不是从文档找词汇,而是从词汇找文档

创建索引有哪些注意点?

第一、选择合适的字段

  • 比如说频繁出现在 WHERE、JOIN、ORDER BY、GROUP BY 中的字段。
  • 优先选择区分度高的字段,比如用户 ID、手机号等唯一值多的,而不是性别、状态等区分度极低的字段,如果真的需要,可以考虑联合索引

第二、要控制索引的数量,避免过度索引,比如说已经有联合索引 (a, b),单索引(a)就是冗余的。每个索引都要占据存储空间,建议单表的索引不超过五个。

第三、联合索引使用时遵循最左前缀原则,定义时区分度高的字段优先于区分度低的字段,等值查询的字段优先于范围查询的字段。

索引哪些情况下会失效?

索引列使用了函数、使用了通配符开头的模糊查询、联合索引不满足最左前缀原则、WHERE条件中使用or的时候部分字段无索引等

索引不适合哪些场景呢?

区分度低的列、频繁更新的列(列更新代表索引也要更新)、数据量小

区分度 = 字段的唯一值数量 / 字段的总记录数

索引是不是建的越多越好

不是,索引是会占用空间的,并且更新建了索引的字段的值也会同时更新索引,导致写入变慢。在索引过多的情况下优化器也有可能选错索引

说说索引优化的思路? 

先通过慢查询日志找出哪些SQL拖后腿,然后调用EXPLAIN查看执行计划,看看是不是走了索引,是否回表、是否排序。然后根据字段特性设计合适的索引,如选择区分度高的字段,使用联合索引和覆盖索引避免索引失效的写法,最后通过实测来验证优化效果。

为什么innodb要使用B+树作为索引?

降低磁盘的I/O次数,支持有序遍历范围查找,因为索引本来就是有序的。

B+树的每个节点都是一个页,MySQL在磁盘中也是按页存储的。

B+树的叶子节点构成了一个有序链表

哈希表不支持范围查询(无序),二叉树太深,B树所有节点都要存数据,所以使用B+树

为什么MongoDB的索引采用B树,而MySQL采用B+树?

MongoDB通常以类似JSON形式存储文档,查询的时候一般是使用单键等值。B树既存储key由存储数据,这样允许搜索的时候允许在非叶子节点提前终止,减少IO次数。

MySQL的查询一般涉及范围、排序、分组等操作。B+树的叶子节点是双向链表结构,无序回溯查找,直接通过叶子节点链表顺序遍历即可,天然具有有序性。

一颗B+树能存多少条数据?

取决于树的高度分支因子

(分支因子)^(树高度-1) × 叶子节点容量

对于 2KW 条数据来说,B+树的高度为 3 层就够了。

为什么索引用B+树而不用二叉树 

因为二叉树在按照顺序从大到小插入时会退化成链表,树的高度就是数据量,导致IO次数增多

平衡二叉树虽然解决了退化成链表的问题,但是每个节点仍然只能有两个分支,深度仍然很大。 

为什么使用B+树而不是B树?

第一,B 树的每个节点既存储键值,又存储数据和指针,导致单节点存储的键值数量较少

第二、B 树的范围查询需要通过中序遍历逐层回溯;而 B+ 树的叶子节点通过双向链表顺序连接,范围查询只需定位起始点后顺序遍历链表即可,没有回溯开销。

第三,B 树的数据可能存储在任意节点,假如目标数据恰好位于根节点或上层节点,查询仅需 1-2 次 I/O;但如果数据位于底层节点,则需多次 I/O,导致查询时间波动较大。

B+ 树的所有数据都存储在叶子节点,查询路径的长度是固定的,时间稳定为 O(logN),对 MySQL 在高并发场景下的稳定性至关重要。

为什么使用B+树而不使用跳表?

跳表本质上仍然是链表,假设每次向下都是二分查找,那么2000w条数据下,查找需要24次IO,因为2000w≈2^24,而B+树最多只需要三次IO就够了

B+树的范围查找怎么做的?

先通过索引路径定位到第一个满足条件的叶子节点,然后顺着叶子节点之间的链表向右/向左扫描,直到超过范围。

了解快排吗?

用分治法将一个序列分割为较小和较大的两个子序列,然后递归排序两个字序列。

核心思想是选择一个基准值,将数组分为两个部分,左边小于基准值,右边大于等于基准值

B+树索引和哈希索引有什么区别?

B+树索引是一种平衡多路搜索树,所有的数据都存在叶子节点上,非叶子节点只存储key和页面指针,叶子节点是有序的,支持范围查找和有序遍历和模糊查询。

Hash索引是将键值映射到固定长度的哈希值,通过哈希值定位数据的位置,不支持有序遍历和范围查找,完全无序,只支持等值查询,常见于Memory引擎。

聚簇索引和非聚簇索引有什么区别?

聚簇索引的叶子节点不仅存储索引,还存储了完整行数据,数据和索引是一起的InnoDB的主键索引就是聚簇索引。非聚簇索引的叶子节点存储的是索引和对应聚簇索引的键值(主键值),需要回表非主键索引都是非聚簇索引,比如唯一索引,普通索引,全文索引,前缀索引,联合索引。

如果使用非主键索引也不想回表,可以定义覆盖索引,并在使用的时候遵循左前缀原则。

回表了解吗?

使用非聚簇索引时,索引没有覆盖所需要查找的列,需要通过非聚簇索引的叶子节点找到对应的主键值,再利用主键值在聚簇索引中找到完整的行记录,这个过程称为回表。

回表的代价是什么?

回表需要访问额外的数据页,如果想要访问的数据不在内存中,还需要从磁盘查找,增加IO开销

可以通过联合索引和覆盖索引避免回表 

什么情况下会触发回表?

查询字段不在非聚簇索引的叶子节点的键值中时候,必须回到主键索引中获取数据

查询字段包含非索引列的时候,必然触发回表

了解MRR吗

MRR是为了避免大量回表引来的大量随机IO问题引入的一种优化策略。

把非聚簇索引查到的主键值列表进行排序,再按顺序去主键索引中批量回表,将随机IO转换为顺序IO,减少磁盘寻道时间。

联合索引了解吗?

联合索引就是把多个字段放在一个索引里,但必须遵守“最左前缀”原则,只有从第一个字段开始连续使用,索引才会生效。

联合索引会根据字段的顺序构造B+树,比如定义了(age, name),会先根据age排序,age相同是再根据name排序,若两者都相同则按照主键排序。

创建(A,B,C)联合索引相当于同时创建了(A)(A,B)(A,B,C)三个索引。

联合索引底层的存储结构是什么样的?

B+树结构,每个节点都存储了所有的索引列值作为key,并且按照定义时的顺序排序。

非叶子节点存储所有的索引列值,并且存储了指向子节点的指针。

叶子节点存储了所有索引列的值,并且存储了对应的主键值

什么是最左前缀原则?

在联合索引中,必须从最左边的字段开始匹配,才能命中索引

范围查询后的列还能用作索引吗?

不能,范围查询会中断后面列的索引使用,因为索引是根据左前缀组织的,只有当左前缀的列值相同时,当前列值才有序。范围查询后,后续的字段不再有序

为什么不从最左边开始查,就无法匹配呢?

因为联合索引组织的时候就是按照最左边的列进行排序的,最左边的列相同后,再依次按照后面的列值进行排序。如果不从左边开始查,无法判断查找范围

什么是索引下推?

没有ICP的情况下,先在数据引擎层用索引查出来记录,WHERE过滤是在服务层进行。ICP,是指把WHERE条件尽可能下推到索引扫描阶段,在存储引擎层提前过滤掉不符合条件的记录,这样可以减少回表次数

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

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

相关文章

第5天:LSTM预测火灾温度

🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍖 原作者:K同学啊 目标 复用LSTM模型实现火灾温度预测 具体实现 (一)环境 语言环境:Python 3.10 编 译 器: PyCharm 框 架: Pytorch &am…

目标检测之YOLOV11自定义数据使用OBB训练与验证

一、前置条件与环境准备 在开始训练前,确保已完成以下准备《目标检测之YOLOV11自定义数据预处理——从原始标注到YOLO-OBB格式转换与验证》: 数据目录结构: yolov11/ ├── datasets/ │ └── shrimp/ │ ├── images/ │ …

Labview教程进阶一(Labview与OPC UA设备通信)

1.Labview与OPC UA设备通信 OPC UA通信协议优势显著,具体表现如下: 跨平台兼容:支持多种操作系统和硬件平台,实现无缝数据交换。高安全性:内置加密、身份验证和授权机制,确保数据传输安全。高效数据交换:采用二进制编码和优化的传输协议,提高通信效率。复杂数据建模:…

【Comsol教程】如何求解指定范围的积分 或 在积分中去除奇异点/异常值

我们在Comsol中经常需要对物体的边界求积分,比如求物体在流场中所受的总流体牵引力,又或者是物体在电场中受到的总介电泳力。当物体的材料或者边界条件存在突变时,物体表面的粘性应力或者麦克斯韦电应力可能会存在异常值。通常解决方法有细化…

Python 多版本治理理念(Windows 平台 · 零基础友好)

🧠 Python 多版本治理理念(Windows 平台 零基础友好) 🌐 核心原则:三维治理、四级隔离、五项自治 以下是基于人工智能深度学习环境搭建实践,总结出的"零基础入门 Conda工具链 全隔离项目环境"…

Python文件管理利器之Shutil库详解

Shutil是一个Python内置的用来高效处理文件和目录迁移任务的库。Shutil不仅支持基本的文件复制、移动和删除操作,还具备处理大文件、批量迁移目录、以及跨平台兼容性等特性。通过使用Shutil,我们可以更加轻松地实现文件系统的管理和维护,本文…

学习华为 ensp 的学习心得体会

引言​ 在信息技术日新月异的今天,网络技术作为连接世界的桥梁,其重要性不言而喻。作为一名对网络技术充满热情的大一新生,我选择了 eNSP(Enterprise Network Simulation Platform,企业网络模拟平台)作为我…

jenkins-2.439.1搭建

一、 二、pipeline文件 pipeline { agent any // 可以指定特定的agent, 如 label 或 docker environment { JAVA_HOME "/usr/local/software/jdk1.8.0_451" PATH "${JAVA_HOME}/bin:${env.PATH}" } tools { …

【threejs】一天一个小案例讲解:控制面板(GUI)

# 好吧,每天更新实在有点艰巨,我尽量少量多次 代码仓 所有代码都会上传到这里,可自行clone GitHub - TiffanyHoo/three_practices: Learning three.js together! 运行效果图 ​ 知识要点 一、安装dat.gui npm i dat.gui 二、使用步骤&a…

飞轮储能辅助双馈风机参与电力系统一次调频的仿真模型研究

以下是一篇关于飞轮储能辅助双馈风机参与电力系统一次调频的仿真模型研究的论文 ,涵盖理论分析、数学模型构建、控制策略设计及仿真验证等内容,适用于电气工程、新能源技术等领域的研究参考。 飞轮储能辅助双馈风机参与电力系统一次调频的仿真模型研究 摘要 随着风电在电力…

一次性理解Java垃圾回收--简单直接方便面试时使用

Java的垃圾回收是一个面试必问题,只要按照下面的步骤回答肯定不会有大问题。 1.先告诉面试官垃圾回收分为两大步: a.识别哪些对象是"垃圾"(不再被使用的对象) b.回收这些垃圾对象占用的内存空间 2. 接下来分别介绍标记阶段和回收阶段的细节…

XML映射文件-辅助配置

如果你没有按照同包同名来,就要下面的配置,指定好路径 1.把路径改为类下面的xml文件 #指定xml映射文件的位置 mybatis.mapper-locationsclasspath:mapper/*.xml

120、三角形最小路径和

题目 解答: 直接按照空间复杂度O(n)来做了。这种明显是动态规划,每一层用到上一层的信息。 观察数据形状,如下: (0,0) (1,0)(1,1) (2,0)(2,1)(2,2) (3,0)(3,1)(3,2)(3,3) ... (n-1,0)...(n-1,n-1) 设dp[n],定义为本层第n…

仕么是Transformer以及工作原理和架构

Transformer 是一种革命性的**深度学习架构**,由 Google 团队在 2017 年论文《Attention is All You Need》中提出。它彻底改变了自然语言处理(NLP)领域,并逐渐扩展到计算机视觉、语音识别等多模态任务。其核心创新在于**完全依赖…

opencv 锁页内存的使用

在OpenCV的CUDA编程中,cv::cuda::HostMem类用于管理锁页内存(Page-Locked Memory)​,这种内存能显著提升主机(CPU)与设备(GPU)间的数据传输效率。而.createMatHeader()正是将HostMem…

亚远景-ASPICE与ISO 26262:理解汽车软件质量保障的双标体系

在汽车行业向智能化、电动化转型的背景下,ASPICE(Automotive SPICE)与ISO 26262作为汽车软件质量保障的两大核心标准,分别从过程能力与功能安全两个维度构建了完整的开发管理体系。以下从标准定位、核心差异、协同实践及行业价值四…

数组的应用

Java数组的基本概念 数组是Java中一种重要的数据结构,用于存储固定大小的相同类型元素。数组在内存中连续分配空间,可以通过索引快速访问元素。数组的声明和初始化是使用数组的基础,声明时需要指定数据类型和数组名称,初始化可以…

基础RAG实现,最佳入门选择(七)

增强型RAG系统的查询转换 采用三种查询转换技术,以提高RAG系统中的检索性能,而无需依赖于像LangChain这样的专门库。通过修改用户查询,我们可以显著提高检索信息的相关性和全面性。 关键转换技术 1.查询重写:使查询更加具体和详…

企业应用观测中枢建设

本文来自腾讯蓝鲸智云社区用户: CanWay 运维挑战加剧 新时代技术背景下,运维面临的挑战加剧: 1、业务数量日益增加、业务规模日益庞大 随着科技发展进步、民众生活富足,线下业务线上化、线上业务复杂化趋势愈演愈烈,各行各业投…

Python实例题:基于边缘计算的智能物联网系统

目录 Python实例题 题目 问题描述 解题思路 关键代码框架 难点分析 扩展方向 Python实例题 题目 基于边缘计算的智能物联网系统 问题描述 开发一个基于边缘计算的智能物联网系统,包含以下功能: 边缘设备管理:连接和管理大量物联网…