[每周一更]-(第122期):模拟面试|数据库面试思路解析

在这里插入图片描述

10|数据库索引:为什么 MySQL 用 B+ 树而不用 B 树?

  1. 为什么 MySQL 用 B+ 树而不用 B 树?

  2. 什么是覆盖索引?

  3. 什么是聚簇索引/非聚簇索引?

  4. 什么是哈希索引?MySQL InnoDB 引擎怎么创建一个哈希索引?

  5. 什么回表?如何避免回表?

  6. 树的高度和查询性能是什么关系?

  7. 什么是索引最左匹配原则?

  8. 范围查询、Like 之类的查询怎么影响数据库使用索引?

  9. 索引是不是越多越好?

  10. 使用索引有什么代价?

  11. 如何选择合适的索引列?组合索引里面怎么确定列的顺序?状态类的列是否适合作为索引的列?

  12. 为什么 MySQL 使用 B+ 树作为索引的数据结构?为什么不用 B 树?为什么不用红黑树?为什么不用二叉平衡树?为什么不用跳表?

  13. NULL 对索引有什么影响?

  14. 唯一索引是否允许多个NULL 值?

1.为什么 MySQL 用 B+ 树而不用 B 树?

  • B+ 树节点只有索引,而数据存储在叶子节点,并通过指针连接各叶子节点,便于范围查询顺序扫描批量读取。相比之下,B 树的数据分布在所有节点上,范围查询效率较低。
  • MySQL 使用 B+ 树而不是 B 树是因为 B+ 树将所有数据都保存在叶子节点,并将这些节点按顺序连接。这使得 B+ 树适合范围查询顺序扫描,尤其是批量读取时可以减少磁盘 I/O 次数,提高查询性能。B 树则将数据存储在所有节点中,没有叶子节点间的顺序连接,不适合数据库的常见查询模式。

2.什么是覆盖索引?

  • 覆盖索引指的是在查询时,只需要从索引中获取数据而不必回表,因为查询所需的字段已包含在索引中。这可以减少 I/O 操作,提升查询效率。

3.什么是聚簇索引/非聚簇索引?

  • 聚簇索引将数据和索引存储在一起。主键是聚簇索引,通过主键可以快速找到数据行。InnoDB 使用主键作为聚簇索引。
  • 非聚簇索引则将索引和数据分离存储,索引中保存了指向数据行的地址。查询时需要先查找索引,再通过索引指向数据行位置。查询非聚簇索引数据通常需要额外的“回表”操作。

4.什么是哈希索引?MySQL InnoDB 引擎怎么创建一个哈希索引?

  • 哈希索引通过哈希函数来加速等值查询(=)。InnoDB 自适应哈希索引自动为高频查询生成哈希索引,但用户不能手动创建。

5.什么是回表?如何避免回表?

  • 回表指索引未包含查询的所有字段,导致数据库需从表中再次查找完整数据。可以使用覆盖索引或调整查询字段避免回表。

6.树的高度和查询性能是什么关系?

  • 树的高度越低,查询性能越高。因为 B+ 树每层节点包含多个分支(多叉树),一般 2-3 层即可覆盖大数据量,通过较少的磁盘读取完成查询,保证查询高效。

7.什么是索引最左匹配原则?

  • 对于组合索引(如 (a, b, c)),最左匹配原则是优先使用最左边的字段;即 a 可以用索引,a, b 可以用,b, c 则无法单独利用索引。

8.范围查询、Like 之类的查询怎么影响数据库使用索引?

  • 范围查询(<<=>>=BETWEEN)会停止组合索引的最左匹配原则,且范围查询后面的字段无法利用索引。
  • LIKE 查询中,只有前缀匹配(LIKE 'abc%')能用索引,前缀带 %LIKE '%abc')则无法利用索引。

9.索引是不是越多越好?

  • 不是。索引会增加存储开销更新成本,维护过多索引会影响写入和更新性能。因此应根据查询需求合理创建索引。

10.使用索引有什么代价?

  • 索引占用存储空间,更新或插入数据时需要维护索引,导致写入性能下降。

11.如何选择合适的索引列?组合索引里面怎么确定列的顺序?状态类的列是否适合作为索引的列?

  • 根据查询频率过滤性选择列。组合索引中的顺序按选择性高的字段优先排列,确保常用查询能有效利用索引。

  • 状态类列如性别、状态等通常选择性低(例如只有 0 和 1),适合作为复合索引的一部分,但不适合单独作为索引列。

12.为什么 MySQL 使用 B+ 树作为索引的数据结构?为什么不用 B 树?为什么不用红黑树?为什么不用二叉平衡树?为什么不用跳表?

  • B+ 树的叶子节点链表结构有利于范围查询;多叉树的低树高适合存储和查询大数据。
  • 红黑树、二叉平衡树、跳表在大数据场景下的树高和随机 I/O 操作较多,性能不如 B+ 树。

13.NULL 对索引有什么影响?

  • 对于 B+ 树索引,NULL 值可以索引,但可能影响查询优化器的选择,特别在 WHERE 子句有多条件查询时,尽量避免索引字段中存储 NULL 值。

14.唯一索引是否允许多个 NULL 值?

  • 是的,唯一索引允许多个 NULL,因为 NULL 被认为是未知值,两个 NULL 不相等。

11|SQL 优化:如何发现 SQL 中的问题?

  1. 请你解释一下 EXPALIN 命令。
  2. 你有优化过 SQL 吗?具体是怎么优化的?
  3. 你有没有优化过索引?怎么优化的?
  4. 怎么优化 COUNT 查询?
  5. 怎么优化 ORDER BY?
  6. 怎么优化 LIMIT OFFSET 查询?
  7. 为什么要尽量把条件写到 WHERE 而不是写到 HAVING 里面?
  8. 怎么给一张表添加新的索引/修改表结构?如果我的数据量很大呢?
  9. USE INDEX/FORCE INDEX/IGNORE INDEX 有什么效果?

1.请解释一下 EXPLAIN 命令。

  • EXPLAIN 命令可以帮助查看 SQL 语句的执行计划,包括如何选择索引、扫描方式、行数预估等信息。它提供关键字段如 typekeyrowsextra,用于分析查询效率,找出性能瓶颈。

2.你有优化过 SQL 吗?具体是怎么优化的?

  • SQL 优化常见方法包括:创建合适的索引、避免全表扫描、使用覆盖索引、减少子查询、优化 JOIN 语句、将频繁查询的结果缓存等。例如,将子查询替换为 JOIN,或通过覆盖索引来减少回表查询。

3.你有没有优化过索引?怎么优化的?

  • 索引优化包括创建合适的单列索引或组合索引,调整组合索引的列顺序,避免冗余索引,删除不常用或选择性低的索引等。此外,使用 EXPLAIN 查看索引的使用情况,有助于识别低效或无效索引。

4.怎么优化 COUNT 查询?

  • 优化

    COUNT
    

    查询可以使用:

    • 使用统计缓存表来存储记录数。
    • 当仅需检查数据存在时,用 COUNT(1)EXISTS 来替代 COUNT(*)
    • 对于大数据量表,避免用 COUNT 直接查询整个表的行数,可以分表、分区或统计汇总表来提高效率。

5.怎么优化 ORDER BY?

  • ORDER BY 可以通过索引优化,比如对排序字段创建索引。对于大数据量的 ORDER BY,可以使用 LIMIT 限制返回的行数,或借助覆盖索引(比如 ORDER BY 使用索引字段且符合最左前缀原则),避免排序操作耗时过长。

6.怎么优化 LIMIT OFFSET 查询?

  • LIMIT OFFSET 查询性能差的原因是数据库必须扫描和丢弃 OFFSET 前的数据。优化方法包括:
    • 使用覆盖索引优化。
    • JOIN 查询来实现分页,将上次查询的最大 ID 作为起始点,这样避免了大量偏移数据扫描。

7.为什么要尽量把条件写到 WHERE 而不是写到 HAVING 里面?

  • WHERE 在数据聚合前过滤数据,效率更高,而 HAVING 在聚合后进行过滤,适合用于聚合函数的筛选。尽量将不涉及聚合的条件放在 WHERE,减少处理的数据量,加快查询速度。

8.怎么给一张表添加新的索引/修改表结构?如果我的数据量很大呢?

  • 对大表添加索引或修改结构可以使用在线索引创建工具或分批操作,如 Percona 提供的 pt-online-schema-change。避免直接在生产环境大表上添加索引,否则会导致锁表和性能下降。

9.USE INDEX/FORCE INDEX/IGNORE INDEX 有什么效果?

  • USE INDEX 指示查询使用指定索引。
  • FORCE INDEX 强制查询使用指定索引,即使优化器认为其他方式更好。
  • IGNORE INDEX 忽略指定索引,从而让优化器选择其他索引或进行全表扫描。

12|数据库锁:明明有行锁,怎么突然就加了表锁?

  1. 什么是行锁、表锁?什么时候加表锁?怎么避免?
  2. 什么是乐观锁?怎么在 MySQL 里面实现一个乐观锁?
  3. 什么是意向锁?可以举一个例子吗?
  4. 什么是共享锁和排它锁?它们有什么特性?
  5. 什么是两阶段加锁?
  6. 什么是记录锁、间隙锁和临键锁?
  7. RC 级别有间隙锁和临键锁吗?
  8. MySQL 是怎么在 RR 级别下解决幻读的?
  9. 什么情况下会加临键锁?什么情况下会加间隙锁?什么时候加记录锁?
  10. 唯一索引和普通索引会怎么影响锁?
  11. 你遇到过什么死锁问题吗?怎么排查的?最终又是怎么解决的?
  12. 你有没有优化过锁?怎么优化的?

1.什么是行锁、表锁?什么时候加表锁?怎么避免?

  • 行锁:针对单行数据的锁,粒度小,适合并发场景;主要用于 UPDATEDELETE 操作。
  • 表锁:锁住整张表,适合低并发、大批量操作。MySQL 自动加表锁的情况一般包括:当未命中索引时的 DELETEUPDATE 或执行 ALTER 操作。
  • 避免表锁

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

React的概念以及发展前景如何?

React是一个由Facebook开发的用于构建用户界面的的开源JavaScript库&#xff0c;它主要用于构建大型、动态的Web应用程序。React的主要特点是使用VirtualDOM&#xff08;虚拟DOM&#xff09;来优化性能&#xff0c;并使用声明式的编程方式来编写UI。 React的主要概念包括&#…

【Spring编程常见错误50例】03.依赖注入常见错误-上

1.多个实现类 如何匹配 在实际的开发中&#xff0c;我们会使用Autowired 注解进行依赖注入对应的bean&#xff0c;但是如果我们依赖的是一个接口&#xff0c;有对应多个实现的话&#xff0c;就会出现异常。 RestController public class DbController {Autowiredprivate DbSe…

智能母线插接箱监测装置的工作原理与实际应用分析

徐悦 安科瑞电气股份有限公司 随着电力系统的智能化发展&#xff0c;如何有效地监控电力系统的运行状态并保证系统安全性&#xff0c;成为电力运维中不可忽视的问题。AMB100智能母线直流监控装置应运而生。本文将详细介绍AMB100的工作原理及技术特点&#xff0c;结合实际应用…

USB包的结构

本文章主要来自《圈圈教你玩USB》的学习笔记 USB包的结构 USB是串行总线&#xff0c;所以数据是一位位的在数据总线上传输&#xff0c;采用LSB在前的方式。 USB数据需要经过位填充和NRZI编码。在这里讨论时&#xff0c;所用的数据都是原始数据&#xff0c;即没有经过位填充和…

让redis一直开启服务/自动启动

文章目录 你的redis是怎么打开的黑窗不能关?必须要自动启动吗?再说说mysql 本文的所有指令都建议在管理员权限下打开cmd控制台 推荐的以管理员身份打开控制台的方式 Win R 打开运行 输入cmdShift Ctrl Enter 你的redis是怎么打开的 安装过redis的朋友都知道, redis的安…

吴恩达深度学习笔记:卷积神经网络(Foundations of Convolutional Neural Networks)4.11

目录 第四门课 卷积神经网络&#xff08;Convolutional Neural Networks&#xff09;第四周 特殊应用&#xff1a;人脸识别和神经风格转换&#xff08;Special applications: Face recognition &Neural style transfer&#xff09;4.11 一维到三维推广&#xff08;1D and 3…

基于图的去中心化社会推荐过滤器

&#x1f3e1;作者主页&#xff1a;点击&#xff01; &#x1f916;编程探索专栏&#xff1a;点击&#xff01; ⏰️创作时间&#xff1a;2024年11月11日19点20分 点击开启你的论文编程之旅https://www.aspiringcode.com/content?id17176636216843&uideba758a1550b46bb…

云计算在教育领域的应用

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 云计算在教育领域的应用 云计算在教育领域的应用 云计算在教育领域的应用 引言 云计算概述 定义与原理 发展历程 云计算的关键技…

开始使用 Elastic AI Assistant 进行可观察性和 Microsoft Azure OpenAI

作者&#xff1a;Jonathan Simon 按照此分步过程开始使用 Elastic AI Assistant for Observability 和 Microsoft Azure OpenAI。 最近&#xff0c;Elastic 宣布&#xff0c;AI Assistant for Observability 现已面向所有 Elastic 用户开放。AI Assistant 为 Elastic Observabi…

uniapp—android原生插件开发(1环境准备)

本篇文章从实战角度出发&#xff0c;将UniApp集成新大陆PDA设备RFID的全过程分为四部曲&#xff0c;涵盖环境搭建、插件开发、AAR打包、项目引入和功能调试。通过这份教程&#xff0c;轻松应对安卓原生插件开发与打包需求&#xff01; 项目背景&#xff1a; UniApp集成新大陆P…

git新手使用教程

git新手使用教程 一、安装和初始化配置2、新建仓库3.工作区域和文件状态4.添加和提交文件5 git reset回退版本6 使用git diff查看差异7 使用git rm删除文件8 .gitignore忽略文件9 注册GitHub账号10 SSH配置和克隆仓库11 关联本地仓库和远程仓库12 Gitee的使用 由B站视频教程整理…

java程序优化二

接触渲染也有一段时间了&#xff0c;发现还有很多优化的空间&#xff0c;今天时间比较有限就提一点 一&#xff1a;从参数接口方面&#xff0c;例如提交渲染接口参数有大量的浮点数据&#xff0c;小数位过多&#xff0c;其实四舍五入保留4位也没什么影响&#xff0c;这样大小接…

分布式----Ceph部署(上)

目录 一、存储基础 1.1 单机存储设备 1.2 单机存储的问题 1.3 商业存储解决方案 1.4 分布式存储&#xff08;软件定义的存储 SDS&#xff09; 1.5 分布式存储的类型 二、Ceph 简介 三、Ceph 优势 四、Ceph 架构 五、Ceph 核心组件 #Pool中数据保存方式支持两种类型&…

在SpringBoot3中启用HTTP2

为什么要在SpringBoot中启用HTTP2 启用HTTP2可以带来更高效的数据传输、更优的性能表现以及更好的用户体验。 二进制格式传输数据&#xff1a;HTTP2采用二进制格式传输数据&#xff0c;而非HTTP1.x的文本格式&#xff0c;这使得协议解析更高效&#xff0c;且便于扩展。 头部压…

HCIP(核心技术篇)—RSTP实验配置

一、回顾STP和STP的缺点和不足 1.STP的概述&#xff1a; STP&#xff08;生成树协议&#xff09;是一种用于在网络中防止产生环路的链路管理协议。 2.STP的作用&#xff1a; 解决二层环路&#xff0c;防止广播报文产生。但是网络拓扑收敛较慢&#xff0c;影响通信质量。 3…

【数据库实验一】数据库及数据库中表的建立实验

目录 实验1 学习RDBMS的使用和创建数据库 一、 实验目的 二、实验内容 三、实验环境 四、实验前准备 五、实验步骤 六、实验结果 七、评价分析及心得体会 实验2 定义表和数据库完整性 一、 实验目的 二、实验内容 三、实验环境 四、实验前准备 五、实验步骤 六…

在线绘制cancer cell同款双向条形图展示富集结果

导读&#xff1a;将上调和下调pathway富集结果以双向条形图的形式在一张图中展示&#xff0c;不仅优化了绘图空间&#xff0c;还通过对称布局增强了图片的美观性。 《Cancer cell》文章“Cross-tissue human fibroblast atlas reveals myofibroblast subtypes with distinct ro…

Linux(文件特殊属性 + FACL 图片+大白话)

后面也会持续更新&#xff0c;学到新东西会在其中补充。 建议按顺序食用&#xff0c;欢迎批评或者交流&#xff01; 缺什么东西欢迎评论&#xff01;我都会及时修改的&#xff01; 在这里真的很感谢这位老师的教学视频让迷茫的我找到了很好的学习视频 王晓春老师的个人空间…

json转excel,读取json文件写入到excel中【rust语言】

一、rust代码 将json文件写入到 excel中。&#xff08;保持json &#xff1a;key原始顺序&#xff09; use indexmap::IndexMap; use serde::Deserialize; use serde_json::{Value, from_str}; use std::error::Error; use std::io::{self, Write}; use std::path::{Path}; u…

理想火车站定位(字节青训)

题目 小F是A市的市长&#xff0c;正在计划在A市新建一个火车站以方便市民的日常出行。市区内的街道布局十分规整&#xff0c;形成网格状。从一个位置[x1, y1]到另一个位置[x2, y2]的距离计算方法为 |x1 - x2| |y1 - y2|&#xff0c;即曼哈顿距离。 在初步考察后&#xff0c;…