当前位置: 首页 > ops >正文

每日八股文6.4

每日八股-6.4

  • Mysql
    • 1.什么是覆盖索引?在什么情况下会用到?
    • 2.回表了解吗?在什么情况下会发生回表查询呢?
    • 3.建立索引要注意什么呢?
    • 4.能给我解释一下什么是 MySQL 的最左匹配原则吗?

Mysql

1.什么是覆盖索引?在什么情况下会用到?

覆盖索引是指在一个查询中,我们需要查询的字段(包括 SELECT 列表中的列、WHERE 子句中的条件列等)都可以在所使用的二级索引的叶子节点中找到,而不需要再回到聚簇索引中去查找完整的行记录。

简单来说,就是我们要查询的数据,索引已经“覆盖”了,不需要再进行回表操作。

使用覆盖索引的主要目的是为了提高查询效率,因为避免了回表操作,减少了一次磁盘 I/O。只需要扫描一次索引 B+ 树就可以获取到所有需要的数据。

2.回表了解吗?在什么情况下会发生回表查询呢?

当我们在使用二级索引(非聚簇索引)进行查询的时候,如果我们要查询的数据列,并不能在二级索引的叶子节点中全部找到,那么就会发生回表查询。

具体来说,二级索引的 B+ 树的叶子节点存储的是索引列的值以及对应数据行的主键 ID。如果我们通过二级索引查询的字段除了索引列本身和主键 ID 之外,还包含了其他的列,那么在二级索引中找到对应的主键 ID 后,还需要再通过这个主键 ID 到聚簇索引(主键索引)中去查找完整的行记录,才能获取到我们需要的全部数据。这个通过二级索引找到主键 ID,然后再回到聚簇索引中查找数据的过程就叫做“回表”。

回表查询会增加额外的 I/O 开销,因此在设计索引和编写 SQL 查询时,我们应该尽量避免不必要的回表,例如可以通过使用覆盖索引来减少回表的发生。

3.建立索引要注意什么呢?

首先,经常出现在 WHERE 子句中的字段是建立索引的首要考虑对象。因为索引的主要目的是为了加快数据检索的速度,如果一个字段经常被用来作为查询条件,那么在该字段上建立索引可以显著提高查询效率。如果查询条件涉及到多个字段,可以考虑建立联合索引。

其次,用于 ORDER BY 和 GROUP BY 子句的字段也适合建立索引。如果查询结果需要排序或者分组,并且排序或分组的字段上存在索引,MySQL 可以直接利用索引的有序性,避免额外的排序操作,提高查询性能。

第三,具有唯一性限制的字段非常适合建立索引,比如商品编码、订单号等。唯一索引不仅可以提高查询速度,还可以保证数据的唯一性。即使不是强制唯一,区分度高(即字段中不同值的比例较高)的字段也适合建立索引,因为区分度越高,索引的选择性就越好,查询效率也越高。

然而,也存在一些不适合建立索引的情况:

  • 在 WHERE、GROUP BY 或 ORDER BY 子句中很少使用的字段,建立索引不会带来明显的性能提升,反而会增加存储空间和维护成本。
  • 字段中存在大量重复数据,区分度很低的字段,比如性别字段,只有男女两种值。在这种情况下,索引的选择性很差,MySQL 优化器可能会选择全表扫描而不是使用索引。
  • 频繁更新的字段不适合建立过多的索引。因为每次更新操作,不仅需要更新表中的数据,还需要更新相关的索引,索引越多,维护成本就越高,可能会降低更新操作的性能。

4.能给我解释一下什么是 MySQL 的最左匹配原则吗?

MySQL 的最左匹配原则是针对联合索引来说的。当我们创建一个包含多个列的联合索引时,例如 (a, b, c),MySQL 在构建这个索引时,会先按照最左边的列 a 进行排序,然后在 a 值相同的情况下再按照列 b 进行排序,最后在 b 值也相同的情况下再按照列 c 进行排序。

因此,在使用这个联合索引进行查询时,查询条件必须从索引的最左侧开始匹配。具体来说有以下几个规则:

  1. 查询条件中必须包含联合索引最左边的列(或者最左边的几个列),这样才能利用到这个联合索引。例如,对于索引 (a, b, c),我们可以使用 WHERE a = 1,WHERE a = 1 AND b = 2,或者 WHERE a = 1 AND b = 2 AND c = 3 这样的查询条件来利用索引。
  2. 如果查询条件中没有使用到联合索引最左边的列 a,那么即使查询条件中包含了 b 或 c,这个联合索引也是无法被使用的。例如,WHERE b = 2 或者 WHERE c = 3 都不会使用到 (a, b, c) 这个索引。
  3. 如果查询条件中跳过了联合索引中间的列,那么只有跳过之前的列可以使用到索引,跳过之后的列无法使用索引。例如,对于索引 (a, b, c),如果查询条件是 WHERE a = 1 AND c = 3,那么只有列 a 能使用到索引,列 c 是无法使用索引的。
  4. 当查询条件中使用了范围查询时,例如 WHERE a > 1 AND b = 2 AND c = 3,那么只有范围查询的列 a 可以使用到索引,而其后面的列 b 和 c 通常无法再使用到索引进行精确匹配。

在这里插入图片描述

http://www.xdnf.cn/news/11967.html

相关文章:

  • C++ 变量二
  • geoai库的训练数据查看与处理
  • 核心机制:拥塞控制
  • 使用pgAdmin导入sql文件
  • 《波段操盘实战技法》速读笔记
  • 数据库-数据查询-in和Not in
  • Linux容器篇、第一章_01Linux系统下 Docker 安装与镜像部署全攻略
  • StringRedisTemplete使用
  • 智能合约安全漏洞解析:从 Reentrancy 到 Integer Overflow
  • 算法训练第八天
  • 电气架构/域控制器/中央计算平台技术论坛
  • 考研系列—操作系统:冲刺笔记(4-5章)
  • 自动化测试工具playwright中文文档-------18.模拟
  • 宝塔使用docker创建n8n
  • 每日一令:Linux 极简通关指南 - 汇总
  • 树莓派超全系列教程文档--(54)如何使用rsync在计算机之间同步文件夹
  • MCPO:使用MCP工具为Open-WebUI/Ollama助力
  • 渗透测试服务如何全方位评估企业安全状况并揭示潜在缺陷?
  • SpringBoot(七) --- Redis基础
  • 在Windows11上安装 Ubuntu WSL
  • 大语言模型备案与深度合成算法备案的区别与联系
  • Rebel系列数据记录仪:智能车载数据采集专家
  • kafka命令
  • 【unity游戏开发入门到精通——通用篇】AssetBundle(AB包)和AssetBundleBrowser的使用介绍
  • 数据结构期末PTA选择汇总
  • L1-019 谁先倒 (15 分)
  • [安卓/ios辅助工具]给按键精灵脚本做一个日志悬浮窗
  • 制造业数字化转型解决方案及应用
  • rk3588开发板实现磁盘自动挂载vmware共享文件夹设置
  • C学习--内存管理