【MySQL】MySQL索引夺命连环问「持续更新中」

news2025/1/12 23:04:19

文章目录

  • 1. 使用MySQL索引的原因
  • 2. 索引的三种常见底层数据结构以及优缺点
  • 3. 索引的常见类型以及它是如何发挥作用的?
  • 4. MyISAM 和 InnoDB 实现 B +树索引方式的区别是什么?
  • 5. InnoDB 为什么设计 B+ 树索引?
  • 6. 什么是覆盖索引和索引下推?
  • 8. 哪些操作会导致索引失效?
  • 9. 字符串加索引
  • 10. 什么是最左匹配原则
  • 11. 索引的应用场景
  • 12. 索引的分类

对MySQL索引底层不了解可以可以阅读这两篇文章进行了解
【MySQL】深入理解B+树索引_起名方面没有灵感的博客-CSDN博客
【MySQL】深入学习B+索引的使用_起名方面没有灵感的博客-CSDN博客

1. 使用MySQL索引的原因

  1. 使用索引是为了提高数据的查询效率。
  2. 对于数据库的表而言,索引就像它的目录
  3. 创建唯一索引,可以保证数据库中每一行数据的唯一性。
  4. 帮助引擎层避免排序和临时表
    1. 如果没有索引,在对表中记录进行排序的时候,需要将记录加载到内存,然后使用一些排序算法在内存中对这些记录排序。
    2. 如果没有索引,就需要建立一个临时表,将符合结果的记录填入这个临时表中,再将结果发送到客户端。
  5. 将随机IO变为顺序IO,加快表和表之间的连接。

2. 索引的三种常见底层数据结构以及优缺点

索引有三种底层数据结构,分别是哈希表、有序数组和树

  1. 哈希表:哈希表适合等值查询的场景,不适合范围查询
    • img
  2. 有序数组:只适合静态存储引擎,等值和范围查询性能好,但更新数据成本高。
    • img
  3. N叉树:由于读写上的性能优点以及适配磁盘访问模式以及广泛应用在数据库引擎中
    1. 以 InnoDB 的一个整数字段索引为例,这个 N 差不多是 1200。棵树高是 4 的时候,就可以存 1200 的 3 次方个值,这已经 17 亿了。考虑到树根的数据块总是在内存中的,一个 10 亿行的表上一个整数字段的索引,查找一个值最多只需要访问 3 次磁盘。其实,树的第二层也有很大概率在内存中,那么访问磁盘的平均次数就更少了。

3. 索引的常见类型以及它是如何发挥作用的?

索引类型分为聚簇索引、二级索引和联合索引

  1. 聚簇索引:聚簇索引使用记录主键值的大小进行记录和页的排序,并且叶子节点存储的是完整的用户记录。
  2. 二级索引:二级索引不再以主键的值进行排序。而是索引中指定的某个列作为大小作为数据页、页中记录的排序规则等等。并且,二级索引⼦节点存储的并不是完整的⽤户记录,⽽是某个列+主键这两个列的值
    1. 当在二级索引中定位到具体的记录的时候,必须根据主键值去聚簇索引中再查找一遍完整的用户记录,这个过程也称为回表。

4. MyISAM 和 InnoDB 实现 B +树索引方式的区别是什么?

  • InnoDB 存储引擎:在InnoDB中,索引即数据。也就是聚簇索引的那棵B+树的叶⼦节点中已经把所有完整的⽤户记录都包含了
  • MyISAM 存储引擎:MyISAM的索引⽅案虽然也 使⽤树形结构,但是却将索引和数据分开存储。索引的叶子节点中存储的不是完整数据,而是主键+行号的组合,通过索引找到行号,再通过行号找到对应的记录。也就是说MyISAM的每一个索引都是二级索引。

5. InnoDB 为什么设计 B+ 树索引?

  • 哈希索引虽然能提供O(1)复杂度查询,但对范围查询和排序却无法很好的支持,最终会导致全表扫描
  • B 树能够在非叶子节点存储数据,但会导致在查询连续数据可能带来更多的随机 IO
  • 而 B+ 树的所有叶节点可以通过指针来相互连接,减少顺序遍历带来的随机 IO

什么是B树?

B树和平衡二叉树的最大区别就是B树属于多叉树。

平衡二叉树的特点:

  1. 根节点的值大于其左子树中任意一个节点的值,小于其右节点中任意一节点的值,这一规则适用于二叉查找树中的每一个节点。
  2. AVL树上任意结点的左、右子树的高度差最大为1。

下面是一个3阶B树

img

可以看到,

  1. 除 根结点 外,所有 非叶子结点 都至少有 M/2 = 1.5 取整 = 2 个结点。

  2. 每个 结点中 的索引值 都是从小到大排序的。

  3. 所有叶子结点都在同一层中。

什么是B+树?

B+树和B树最大的不同是:

  1. B+树内部有两种结点,一种是索引结点,一种是叶子结点。
  2. B+树的索引结点并不会保存记录,只用于索引,所有的数据都保存在B+树的叶子结点中。而B树则是所有结点都会保存数据。
  3. B+树的叶子结点都会被连成一条链表。叶子本身按索引值的大小从小到大进行排序。即这条链表是 从小到大的。多了条链表方便范围查找数据。
  4. B树的所有索引值是不会重复的,而B+树 非叶子结点的索引值 最终一定会全部出现在 叶子结点中。

img


6. 什么是覆盖索引和索引下推?

  1. 覆盖索引
    1. 在某个查询里面,索引 k 已经“覆盖了”我们的查询需求,称为覆盖索引。
    2. 覆盖索引可以减少树的搜索次数,显著提升查询性能,所以使用覆盖索引是一个常用的性能优化手段。
      1. 之所以能减少树的搜索次数,比如说查询key1,使用了key1的索引,这个B+树的数据就包含了主键值+key1,因此不需要回表操作,减少了树的搜索次数。
  2. 索引下推
    1. MySQL 5.6 引入的索引下推优化(index condition pushdown), 可以在索引遍历过程中,对索引中包含的字段先做判断,直接过滤掉不满足条件的记录,减少回表次数。
    2. 若不使用索引下推优化时,获取下一行,首先读取索引信息,然后根据索引将整行数据读取出来。然后再通过where条件判断当前数据是否符合条件,符合返回数据。
    3. 若使用索引下推,获取下一行的索引信息。检查索引中存储的列信息是否符合索引条件,如果符合将整行数据读取出来,如果不符合跳过读取下一行。接着用剩余的判断条件,判断此行数据是否符合要求,符合要求返回数据。

img


8. 哪些操作会导致索引失效?

  • 对索引使用左或者左右模糊匹配,也就是 like %xx 或者 like %xx% 这两种方式都会造成索引失效。原因在于查询的结果可能是多个,不知道从哪个索引值开始比较,于是就只能通过全表扫描的方式来查询
  • 对索引进行函数/对索引进行表达式计算,因为索引保持的是索引字段的原始值,而不是经过函数计算的值,自然就没办法走索引。
  • 对索引进行隐式转换相当于使用了新函数
  • WHERE 子句中的 OR语句,只要有条件列不是索引列,就会进行全表扫描

9. 字符串加索引

  1. 字符串加索引,如果直接使用完整字符串建立索引,会比较占用空间
  2. 因此会创建前缀索引,但会增加查询扫描次数,并且不能使用覆盖索引。
    1. 之所会增加查询扫描次数,是因为前缀符合条件的话,需要进行回表操作判断是不是符合条件
    2. 覆盖索引是说索引 k 已经“覆盖了”我们的查询需求,但是前缀索引是拿字符串前几个字符存放进索引的。
  3. 并且使用前缀索引不能完成排序需求。
    1. 因为前缀索引是拿字符串前几个字符存放进索引的。相同的前缀在索引中是有序的,但是它们完整的字符串未必是有序的。

10. 什么是最左匹配原则

最左匹配原则就是指在联合索引中,如果你的 SQL 语句中用到了联合索引中的最左边的索引,那么这条 SQL 语句就可以利用这个联合索引去进行匹配。MySQL会一直向右匹配直到遇到范围查询(>、<、between、like)就停止匹配。

比如对(a,b,c)建立联合索引,如果查询条件第一个不包含a,那么就不会使用索引。

最左前缀匹配原则: 在MySQL建立联合索引时会遵守最左前缀匹配原则,即最左优先,在检索数据时从联合索引的最左边开始匹配。


11. 索引的应用场景

  1. 不需要创建索引的情况
    1. 表记录太少,二级索引有时候需要回表操作,记录太少的话全表搜索的速度比索引查找+回表的效率更高。
    2. 经常增删改的表。CRUD会对B+树的记录的排序造成破坏。
    3. 数据重复且分布平均的表字段,因此应该只为经常查询和经常排序的数据列建立索引。
    4. Where条件里用不到的字段不创建索引。因为MySQL维护一个索引树也需要耗费空间。
  2. 需要创建索引的情况
    1. 主键自动建立唯一索引
    2. 频繁作为查询的条件的字段应该创建索引
    3. 查询中与其他表关联的字段,外键关系建立索引
    4. 查询中排序的字段,排序字段若通过索引去访问将大大提高排序的速度
    5. 查询中统计或者分组字段

12. 索引的分类

img

详细可以看【MySQL】1.索引_起名方面没有灵感的博客-CSDN博客


参考:

  • 60 道 MySQL 精选面试题👍
  • InnoDB为什么要选择B+树来存储数据 - 腾讯云开发者社区-腾讯云 (tencent.com)
  • B树和B+树_ZJE_ANDY的博客-CSDN博客_b树和b+树
  • 索引下推详解_走出半生仍是少年的博客-CSDN博客_索引下推
  • MYSQL | 最左匹配原则的原理 - 腾讯云开发者社区-腾讯云 (tencent.com)
  • 索引的应用场景(哪些情况需要,哪些不需要)_温柔的ci的博客-CSDN博客_索引适用以及不适用的场景

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

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

相关文章

【JavaSE专栏7】Java 常量、变量及其作用域

作者主页&#xff1a;Designer 小郑 作者简介&#xff1a;Java全栈软件工程师一枚&#xff0c;来自浙江宁波&#xff0c;负责开发管理公司OA项目&#xff0c;专注软件前后端开发&#xff08;Vue、SpringBoot和微信小程序&#xff09;、系统定制、远程技术指导。CSDN学院、蓝桥云…

Python论文绘图利器seaborn.lineplot

Python论文绘图利器seaborn.lineplot 提示&#xff1a;前言 Python论文绘图利器seaborn.lineplot 提示&#xff1a;写完文章后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录Python论文绘图利器seaborn.lineplot前言一、导入包二、加载数据三…

嵌入式桌面管理系统Matchbox

简介 Matchbox&#xff08;中文译名&#xff1b;火柴盒&#xff09;是X Window System的免费和开源Window Manager&#xff0c;它主要用于嵌入式系统。取名Matchbox&#xff0c;很形象的表明它只适用于屏幕只有火柴盒大小的设备。 buildroot 移植MatchBox session managermat…

高斯秩变换 RankGauss 可能是比标准化/归一化更有效的连续值特征变换方法

文章目录 一、前言二、关键原理三、总结CSDN 叶庭云:https://yetingyun.blog.csdn.net/ 一、前言 高斯秩变换是 Kaggle 竞赛大佬 Michael Jahrer(Grandmaster) 提出的一种新颖的特征变换方法,他称之为 RankGauss。类似归一化(MinMax)和标准化(Standardization)的作用,…

帆软报表 V8 get_geo_json 任意文件读取漏洞

帆软报表 V8 get_geo_json 任意文件读取漏洞 CNVD-2018-04757 1.漏洞介绍 FineReport报表软件是一款纯Java编写的&#xff0c;集数据展示(报表)和数据录入(表单)功能于一身的企业级web报表工具。 FineReport v8.0版本存在任意文件读取漏洞&#xff0c;攻击者可利用漏洞读取网…

车载以太网 - 测试用例设计 - 头部信息检测 - 10

前面的篇幅已经把ISO 13400中DoIP软件协议规范部分进行详细的介绍说明,如果在文章中有哪些介绍的不充分或者不够详细,欢迎评论区留言讨论;接下来的文章主要介绍DoIP协议相关的测试用例设计,这也是一个测试工程师必备的重要技能之一,能否保证测试执行完成后,软件质量是达到…

超级详解洛谷P4011 孤岛营救问题(bfs超难题)(保证看懂)

题目 说明 1944 年&#xff0c;特种兵麦克接到国防部的命令&#xff0c;要求立即赶赴太平洋上的一个孤岛&#xff0c;营救被敌军俘虏的大兵瑞恩。瑞恩被关押在一个迷宫里&#xff0c;迷宫地形复杂&#xff0c;但幸好麦克得到了迷宫的地形图。迷宫的外形是一个长方形&#xff…

阿里“云开发“小程序(uniCould)

博主ps&#xff1a; 网上资料少的可怜&#xff0c;哎&#xff0c;腾讯云涨价了&#xff0c;论服务器&#xff0c;我肯定选的阿里&#xff0c;再着你们对比下unicould的报价就知道了&#xff0c;如果有钱就另当别论了。 所以这片博文&#xff0c;博主试过之后&#xff0c;先抛出…

(day8) 自学Java——拼图小游戏

GUI(图形用户接口)&#xff0c;是指采用图形化的方式显示操作界面。 Java中包含两套完整体系&#xff1a;AWT包&#xff0c;Swing包 一.代码 package com.abc.ui;import javax.swing.*; import javax.swing.border.BevelBorder; import java.awt.event.ActionEvent; import ja…

JavaEE day5 初识CSS 2

选择器 基本选择器&#xff1a;id选择器、类选择器、元素选择器 复合选择器&#xff1a;并列选择器、子孙选择器、孩子选择器 通配符选择器 *{.....} 任意元素&#xff1a;书写一些全局的规则时使用&#xff0c;就等于是一个全局都要遵守的规则 伪类选择器&#xff1a;针…

Lab 3: Midterm Review

Lab3 部分questionQ5&#xff1a;Its Always a Good PrimeQ6&#xff1a;Church numeralsQ5&#xff1a;It’s Always a Good Prime Implement div_by_primes_under, which takes in an integer nand returns an n-divisibility checker. An n-divisibility-checker is a funct…

【蓝桥杯选拔赛真题35】python回文数升级 青少年组蓝桥杯python 选拔赛STEMA比赛真题解析

目录 python输出N除以3的商 一、题目要求 1、编程实现 2、输入输出

二叉树22:二叉搜索树中的搜索

主要是我自己刷题的一些记录过程。如果有错可以指出哦&#xff0c;大家一起进步。 转载代码随想录 原文链接&#xff1a; 代码随想录 leetcode链接&#xff1a;700. 二叉搜索树中的搜索 题目&#xff1a; 给定二叉搜索树&#xff08;BST&#xff09;的根节点 root 和一个整数…

变量的了解

1、普通局部变量 -------------定义形式&#xff1a;在{}里面定义的 普通变量 叫做 普通局部变量 -------------作用范围&#xff1a;所在的 {} 复合语句之间有效 -------------生命周期&#xff1a;所在的 {} 复合语句之间有效 -------------存储区域&#xff1a;栈区 ---…

2.6 JAVA运算符

文章目录1.运算符概述2.运算符具体功能3.基本四则运算符4.取余运算符5.自增自减运算符6.比较运算符7.逻辑运算符8.三目运算符9.赋值运算符10.综合练习&#xff1a;求平年闰年1.运算符概述 运算符用于连接表达式的操作数&#xff0c;并对操作数执行运算。 例如&#xff0c;表达…

使用java来创建es索引(基于es7.8)

1、先引入pom依赖&#xff1a; <dependencies> <dependency> <groupId>org.elasticsearch</groupId> <artifactId>elasticsearch</artifactId> <version>7.8.0</version> …

零基础学JavaWeb开发(二十四)之 springmvc入门到精通(4)

三、整合前端layui 前后端分离架构模式 前端---页面编写好 数据源来自于 后端接口 layui或者vue等 将接口编写好即可&#xff08;springmvc&#xff09; 1、使用layui画出首页界面 html/js/css 表格 - 页面元素 - Layui 引入css <!-- 引入layui css --> <link …

MySQL优化(1)执行计划explain中type属性详解

系列文章目录1.初始化测试数据1.初始化表格&#xff08;user表&#xff09;2.初始化表格&#xff08;product表&#xff09;3.初始化表格&#xff08;user表数据初始化&#xff09;4.初始化表格&#xff08;product表函数&#xff09;5.初始化表格&#xff08;product表数据初始…

雷达编程实战之信号处理流程

信号处理_MatlabAD数据幅相校准1DFFT2DFFT由射频前端发射、接收信号&#xff0c;至获得目标径向距离、径向速度、径向角度、RCS等目标属性信息&#xff0c;这个过程&#xff0c;我们谓之&#xff0c;FMCW毫米波雷达信号处理流程。 VCO为压控振荡器(Voltage Controlled Oscilla…

从技术角度看Android大系统的构成

最近因为工作需要&#xff0c;再次捡起了放下多年的Android开发。说起Android&#xff0c;还是要感谢这个时代&#xff0c;感谢开源。这个时代&#xff0c;让我们开发者&#xff0c;可以通过开源&#xff0c;通过开源的Android&#xff0c;学到很多东西。有如此感慨&#xff0c…