秋招后端开发面试题 - MySQL索引


目录

  • MySQL索引
    • 前言
    • 面试题
    • MySQL 索引篇
      • 什么是索引?
      • 索引分别有哪些优点和缺点?
      • MySQL 索引的注意事项
      • 为什么 MySQL 官方建议使用自增主键作为表的主键?
      • 索引有几种类型?分别如何创建?
      • 什么叫回表查询?
      • 在 InnDB 中主键索引为什么比普通索引的查询性能高?
      • MySQL 复合索引应该注意什么?
      • 复合索引的作用是什么?
      • 什么是最左匹配原则?它的生效原则有哪些?
      • 以下语句会走索引么?
      • 什么是前缀索引?
      • 为什么要用前缀索引?
      • 什么情况下适合使用前缀索引?
      • InnoDB 为什么要使用 B+ 树,而不是 B 树、Hash、红黑树或二叉树?
      • MySQL 如何指定查询的索引?
      • 在 MySQL 中指定了查询索引,为什么没有生效?
      • 如何优化身份证的索引?
      • 索引的使用场景
      • 聚簇索引和非聚簇索引
      • 你写过索引吗?
      • InnoDB 索引实现
      • MyISAM 索引实现
      • 主键索引是聚集索引还是非聚集索引?
      • MyISAM 索引实现?
      • MyISAM 索引与 InnoDB 索引的区别?
      • 简单说一说 drop、delete 与 truncate 的区别
      • delete、truncate 和 drop 分别在什么场景之下使用?
      • ⭐为什么 B+Tree 比 B-Tree 更适合实际应用中操作系统的文件索引和数据库索引?
      • ⭐Hash 索引和 B+ 树有什么区别或者说优劣呢?
      • 非聚簇索引一定会回表查询吗?
      • 创建的索引有没有被使用到?或者说怎么才可以知道这条语句运行很慢的原因?


MySQL索引

前言

已经找到工作了,分享秋招时的笔记。祝大家都能顺利找到自己心仪的工作。


面试题

MySQL 索引篇

什么是索引?

索引是一种帮助 MySQL 提高查询效率的数据结构

索引分别有哪些优点和缺点?

索引的优点:

  • 提高查询效率

索引的缺点:

  • 虽然提高了查询速度,但却降低了更新表的速度
  • 因为更新数据时,MySQL 不仅要更新数据,还要更新索引文件
  • 建立索引的索引文件会占用磁盘

MySQL 索引的注意事项

  • 联合索引遵循前缀原则
  • like 模糊查询,% 百分号不能在前
  • 如果 MySQL 估计使用索引比全表扫描更慢,会放弃使用索引
  • 如果 or 前面的条件的列有索引,后面没有,会放弃使用索引
  • 列类型是字符串,查询时一定要给值加引号,否则索引失效

为什么 MySQL 官方建议使用自增主键作为表的主键?

  • 页分裂问题:如果使用非自增主键作为表的主键的话,当新插入的数据会将数据页写满,mysql 就需要申请新的数据页,并且把上个数据页中的部分数据移动到新的数据页上,以确保索引有序。也就是说**会造成页分裂,大量移动数据的过程严重影响插入效率
  • 存储空间问题:自增主键存储空间小,同一个结点内能存放更多的主键,降低树的高度,减少 IO 次数

索引有几种类型?分别如何创建?

MySQL 的索引有两种分类方式:逻辑分类和物理分类

按照逻辑分类,索引可分为:

  • 主键索引:一张表只能有一个主键索引,不允许重复、不允许为 NULL
  • 唯一索引:数据列不允许重复,允许为 NULL 值,一张表可有多个唯一索引
  • 普通索引:一张表可以创建多个普通索引,可以重复,允许 NULL 值插入

按照物理分类,索引可分为:

  • 聚簇索引:InnoDB 的主键索引存储采用聚簇索引,主键和数据存放在一起
  • 非聚簇索引:MyISAM 的主键索引存储采用非聚簇索引,主键和指向数据的指针存放在一起,数据另开空间存储

什么叫回表查询?

普通索引查询到主键索引后,回到主键索引树搜索的过程,称为回表查询

在 InnDB 中主键索引为什么比普通索引的查询性能高?

因为普通索引的查询会多执行一次回表查询操作

MySQL 复合索引应该注意什么?

MySQL 中的复合索引遵循最左匹配原则

复合索引的作用是什么?

  • 多字段查询减少建立额外索引的开销
  • 覆盖索引:直接通过遍历索引取得数据,不需要回表查询减少随机的 IO 操作

什么是最左匹配原则?它的生效原则有哪些?

  • 最左匹配原则也叫最左前缀原则,在联合索引中,索引的左侧列将优先参与索引的匹配和筛选,而后续列只有在左侧列匹配的情况下才会被考虑
  • 当遇到范围查询停止匹配

以下语句会走索引么?

select * from t where year(date)>2018;

不会,因为在索引列上涉及到了运算

什么是前缀索引?

前缀索引也叫局部索引,比如给身份证的前 10 位添加索引。 类似这种给某列部分信息添加索引的方式叫做前缀索引

为什么要用前缀索引?

  • 前缀索引能有效减小索引文件的大小,让每个索引页可以保存更多的索引值,从而提高了索引查询的速度
  • 缺点:不能在 order by 或者 group by 中触发前缀索引,也不能用于覆盖索引

什么情况下适合使用前缀索引?

当字符串本身可能比较长,而且前几个字符就开始不相同,适合使用前缀索引

InnoDB 为什么要使用 B+ 树,而不是 B 树、Hash、红黑树或二叉树?

B 树

  • B 树的非叶子节点也保存数据,导致扇出 (节点的最大子节点数量) 减少,需要更多层级,同时增加内存和磁盘的开销,降低数据访问的效率
  • B+ 树将数据全部保存在叶子节点,减少磁盘IO的开销,提高了查询效率

Hash

  • Hash 索引适用于等值查询,但不支持范围查询和排序操作

二叉树

  • 普通二叉树的高度可能不均匀
  • 二叉树无法自动平衡,需要特殊的平衡操作来维护树的性能

红黑树

  • 红黑树虽然是一种自平衡二叉搜索树,但是在数据量巨大时,高度仍然可能增加,导致性能下降

MySQL 如何指定查询的索引?

在 MySQL 中可以使用 force index 强行选择一个索引

select * from t force index(index_t);

在 MySQL 中指定了查询索引,为什么没有生效?

  • MySQL 会根据优化器自己选择索引
  • 如果 force index 指定的索引出现在候选索引上,MySQL 就不会在判断扫描的行数,直接使用指定的索引,如果没在候选索引中,即使 force index 指定了索引也是不会生效的

如何优化身份证的索引?

前 6 位代表的是地区,所以很多人的前六位都是相同的,如果我们使用前缀索引为 6 位的话,性能提升也并不是很明显,但如果设置的位数过长,那么占用的磁盘空间也越大,数据页能放下的索引值就越少,搜索效率也越低

  • 使用身份证倒序存储,这样设置前六位的意义就很大了
  • 使用 hash 值,新创建一个字段用于存储身份证的 hash 值

索引的使用场景

  • 对于非常小的表,大部分情况下全表扫描效率更高
  • 中到大型表,索引非常有效
  • 特大型的表,建立和使用索引的代价会随之增大,可以使用分区技术来解决

聚簇索引和非聚簇索引

  • 聚簇索引:InnoDB 的主键索引存储采用聚簇索引,主键和数据存放在一起
  • 非聚簇索引:MyISAM 的主键索引存储采用非聚簇索引,主键和指向数据的指针存放在一起,数据另开空间存储

你写过索引吗?

InnoDB 索引实现

InnoDB使用 B+Tree 作为索引结构

  • 主键索引
    • MyISAM 索引文件和数据文件是分离的,索引文件仅保存数据记录的地址
    • InnoDB 中,表数据文件本身就是按 B+ 树组织的一个索引结构,这棵树的叶节点 data 域保存了完整的数据记录。这个索引的 key 是数据表的主键,因此 InnoDB 表数据文件本身就是主索引
  • InnoDB 的辅助索引:nnoDB 的所有辅助索引都引用主键作为 data 域

MyISAM 索引实现

MyISAM 索引文件和数据文件是分离的,索引文件仅保存数据记录的地址

  • 主键索引:MyISAM 引擎使用 B+Tree 作为索引结构,叶节点的data 域存放的是数据记录的地址
  • 辅助索引:在 MyISAM 中,主索引和辅助索引(Secondary key)在结构上没有任何区别,只是主索引要求 key 是唯一的,而辅助索引的 key 可以重复

🌟InnoDB 聚簇索引:

  • 主键索引树,根结点存的是主键 id 和对应的数据
  • 辅助索引树,根结点存的是辅助索引和对应的主键索引,因此需要根据主键到主键索引树上在遍历一次得到对应的数据

🌟MyISAM 非聚簇索引:

  • 主键索引树,根结点存的是主键到数据地址的映射
  • 辅助索引树,根结点存的是辅助索引到数据地址的映射,也可以直接得到数据,不需要回表

主键索引是聚集索引还是非聚集索引?

在 InnoDB 下主键索引是聚集索引
在 MyISAM 下主键索引是非聚集索引

MyISAM 索引实现?

MyISAM 存储引擎使用 B+Tree 作为索引结构,叶节点的 data 域存放的是数据记录的地址

MyISAM 索引与 InnoDB 索引的区别?

  • InnoDB 索引是聚簇索引,MyISAM 索引是非聚簇索引
  • InnoDB 的主键索引的叶子节点存储着索引和行数据,因此主键索引非常高效
  • MyISAM 索引的叶子节点存储的是行数据地址,需要根据地址访问对应的地址才能得到数据
  • InnoDB 非主键索引的叶子节点存储的是主键和其他带索引的列数据,因此查询时做到覆盖索引会非常高效

简单说一说 drop、delete 与 truncate 的区别

  • drop 用于删除数据库对象,操作不可逆
  • delete 用于删除满足条件的行,可以带条件,操作可逆
  • truncate 用于从表中删除所有行,但保留表的结构,操作不可逆

delete、truncate 和 drop 分别在什么场景之下使用?

  • 想删除部分数据行时候,用 delete,并且带上 where 子句
  • 保留表而删除所有数据的时候用 truncate
  • 不再需要一张表的时候,用 drop

⭐为什么 B+Tree 比 B-Tree 更适合实际应用中操作系统的文件索引和数据库索引?

  • 范围查询和顺序访问效率高:B+ 树的叶子节点形成有序链表,使得范围查询和顺序访问非常高效
  • 更少的磁盘 I/O 操作:B+ 树的非叶子节点只存储索引信息,而数据都存储在叶子节点中,在进行索引搜索时,更多的数据能够在一个页中找到,从而减少磁盘读取
  • 更稳定的高度:B+ 树的高度相对较低,B 树的高度会随着数据量的增加而增加,可能导致更多的磁盘 I/O 操作

⭐Hash 索引和 B+ 树有什么区别或者说优劣呢?

  • Hash 索引进行等值查询更快,但是无法进行范围查询
  • Hash 索引不支持使用索引进行排序
  • Hash 索引不支持模糊查询
  • Hash 索引需要回表查询数据,而 B+ 树在符合聚簇索引和覆盖索引的时候可以只通过索引完成查询
  • Hash 索引虽然在等值查询上较快,但是不稳定,可能发生哈希碰撞,而 B+ 树的查询效率比较稳定,对于所有的查询都是从根节点到叶子节点,且树的高度较低

非聚簇索引一定会回表查询吗?

如果联合索引就可以实现索引覆盖,就不需要回表查询

创建的索引有没有被使用到?或者说怎么才可以知道这条语句运行很慢的原因?

MySQL 提供了 explain 命令来查看语句的执行计划


秋招后端开发面试题系列目录
一、Java
1.1 Java基础上
1.2 Java基础下
1.3 Java集合
1.4 JavaIO
1.5 Java多线程上
1.6Java多线程下
二、JVM
2.1 JVM底层原理
2.2 垃圾回收器
2.3 垃圾回收算法
2.4 类加载机制
2.5 运行时数据区
三、MySQL
3.1 MySQL基础
3.2 事务
3.3 索引
3.4 锁机制
3.5 MVCC
四、Redis
4.1 Redis基础
4.2 缓存原理
五、中间件
5.1 RabbitMQ
六、Spring开源框架
6.1 Spring
6.2 Spring MVC
6.3 Spring Boot
6.4 MyBatis
七、操作系统
八、计算机网络
九、设计模式
十、微服务架构
十一、Spring Cloud分布式
11.1 分布式基础
11.2 Spring Cloud
11.3 GateWay
11.4 Nacos
11.5 OpenFeign
11.6 Ribbon
十二、算法
十三、项目

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

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

相关文章

SpringMVC简介和体验

一、SpringMVC简介和体验 1.1 介绍 Spring Web MVC :: Spring Framework Spring Web MVC是基于Servlet API构建的原始Web框架,从一开始就包含在Spring Framework中。正式名称“Spring Web MVC”来自其源模块的名称( spring-webmvc )&#…

分享几个副业,一天搞100~200不成问题,一不小心收益比你主业还多

每次家庭聚会,总是那些老掉牙的话题在耳边萦绕:“孩子,你工资多少啊?买车买房了吗?”仿佛只有按部就班地上班、结婚生子,才是人生的唯一出路。 然而,在这个充满机遇的时代,谁说“不上…

torch.flatten(x, 1)”和“x.view(x.size(0), -1)”有什么区别?

这两个操作在 PyTorch 中都用于将张量展平为一维。它们的主要区别在于实现方式和适用情况: torch.flatten(x, 1): 这是一个函数调用,其中 x 是输入张量,1 是指定要展平的起始维度。此函数会将张量 x 从指定的起始维度开始展平&…

2.5W字 一文读懂汽车智能座舱的FLASH 存储市场、技术

吃瓜群众:机哥,存储是什么玩意,我买手机、电脑的时候导购员都说买内存大的,三星的好,品牌大,问题少,我也只有看哪个内存大就买那个。 机哥:额,这个嘛,说来话长…

微信一键登录怎么做的?流程是什么?

实现方法:三种方法 点击【登录】按钮 》(系统框)绑定手机号》如果绑定:登录成功点击【登录】按钮》直接登录成功了 >后续可以在设置中【绑定手机号】点击【登录】按钮 -》 打开一个新的页面(绑定手机号):自己的表单 -》进行手机号绑定的验证 方式一:业务流程)用…

Leetcode 3128. Right Triangles

Leetcode 3128. Right Triangles 1. 解题思路2. 代码实现 题目链接:3128. Right Triangles 1. 解题思路 这一题的话对于任意一个位置,如果该位置为1,假设其所在行中1的个数 r i r_i ri​,所在列中1的个数为 c j c_j cj​&#…

数据库大作业——基于qt开发的图书管理系统(二) 相关表结构的设计

前言 在上一篇文章中。我们完成了Qt环境的安装,同时完成了有关项目需求的分析并绘制了整体的项目架构图,而在图书管理系统中,其实我们主要完成的就是对数据的增删改查,并将这些功能通过信号与槽机制和可视化界面绑定在一起&#…

VmWare 虚拟机没有网络解决办法

由于最近需要,装了个VM虚拟机,但是突然发现本机有网络,虚拟机却没有网络,更换了虚拟机的网络设置,都尝试过了 都不管用, 最后尝试了这种方法完美解决 还原网络默认设置 首先还原虚拟网络编辑器设置 启动V…

一些可用于研究的GIS数据资源

国内的情况就不用说了,基本上是很难找到可以用于研究的GIS数据资源的。要么就是收费,免费的即使能找到,能否合法合规的进行使用也是一个问题。地理信息数据还是国外比较开放一些,相当多的政府组织或者公益机构对公众开放了下载渠道…

ASP.NET网上图书订阅系统的设计

摘 要 网上图书订阅系统基于 Microsoft SQL Server 2000和ASP.NET平台,以C#为编程语言开发,实现了网上图书预订和借阅,订阅信息查询,图书和用户信息的修改,借阅排行和新到图书的查询等功能,这样不但可将管理员从繁重…

springboot 打成的jar包为什么能直接运行?

Spring Boot 应用程序被打包成的jar包之所以可以直接通过 java -jar 命令运行,是因为Spring Boot在构建过程中做了一些特殊的设计和配置。具体原因: Fat/Uber JAR: Spring Boot使用maven插件spring-boot-maven-plugin(或Gradle对应的插件&…

【Elasticsearch<四>✈️✈️】SpringBoot 项目整合 Elasticsearch

目录 🍸前言 🍻一、Elasticsearch 本地环境启动 🍺二、SpringBoot 项目整合 Elasticsearch 2.1 引入 ES 依赖 2.2 配置 ES 属性 2.3 创建实体类 2.4 操作 ES 的工具类 2.5 操作 ES 的业务层 🍹三、接口测试 3.1 编写测试类 3…

什么是Spring Cloud的负载均衡?如何实现?

Spring Cloud的服务注册与发现机制在微服务架构中发挥着至关重要的作用,确保服务之间的动态通信和协同工作。以下是关于Spring Cloud如何实现服务注册与发现的进一步细节: 服务注册 在Spring Cloud微服务架构中,服务注册通常是通过集成特定…

外贸企业邮箱是什么?做外贸企业邮箱哪个好?

外贸企业邮箱是什么?外贸企业在进行跨国沟通时必不可少的工具就是外贸企业邮箱,外贸企业邮箱需要具备的条件就是海外邮件抵达率高、安全稳定、多语言沟通。而我们又怎么选择一个适合的外贸企业邮箱呢?小编今天带您一起了解。 一、外贸企业邮…

【MicroPython ESP32】ssd1306驱动0.96“I2C屏幕汉字显示示例

所需模块micropython-ssd1306模块 中文下载站:https://www.cnpython.com/pypi/micropython-ssd1306/download 官方下载站:https://pypi.org/project/micropython-ssd1306/ 汉字取模说明 取模工具:pctolcd2002取模方式: UTF-8字…

华为 二层交换机与防火墙连通上网实验

防火墙是一种网络安全设备,用于监控和控制网络流量。它可以帮助防止未经授权的访问,保护网络免受攻击和恶意软件感染。防火墙可以根据预定义的规则过滤流量,例如允许或阻止特定IP地址或端口的流量。它也可以检测和阻止恶意软件、病毒和其他威…

嵌入式系统应用-拓展-FLASH之操作 SFUD (Serial Flash Universal Driver)之KEIL移植

1 SFUD介绍 1.1 初步介绍 SFUD 是一个开源的串行 SPI 闪存通用驱动库。由于市面上有各种类型的串行闪存设备,每种设备都具有不同的规格和指令,因此 SFUD 的设计目的是解决这些差异。这使得我们的产品可以支持不同品牌和规格的闪存,增强了软…

408数据结构-树与森林 自学知识点整理

前置知识:树的基本概念与性质 树的存储结构 树既可以采用顺序存储结构,又可采用链式存储结构。但无论采取哪种方式,都要求能够唯一地反映树中各结点之间的逻辑关系。 1. 双亲表示法 这种存储结构采用一组连续空间来存储每个结点&#xff0…

【力扣一刷】代码随想录day44(动态规划part6 - 背包问题专题: 完全背包理论基础、卡码网52、518. 零钱兑换 II、377. 组合总和 Ⅳ )

【完全背包理论基础】 与01背包问题的区别: 1、物品的可取次数:完全背包和01背包问题唯一不同的地方就是,01背包问题的每种物品只能取0次或1次,而完全背包问题的每种物品可以取无限次。 2、遍历滚动数组的顺序:01背包问…

软件开发标准流程与软件工程基本理论

软件开发标准流程与软件工程基本理论 一、需求分析 软件开发需要,自用户提出开始,商业合作确定(规范化:软件开发项目合同),进入软件工程开始阶段:需求分析。 软件项目Team负责需求分析开发人员…