[每周一更]-(第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 操作。
  • 避免表锁

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

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

相关文章

java-智能识别车牌号_基于spring ai和开源国产大模型_qwen vl

用大模型做车牌号识别&#xff0c;最简单高效 在Java场景中&#xff0c;java识别车牌号的需求非常普遍。过去&#xff0c;我们主要依赖OCR等传统方法来实现java识别车牌号&#xff0c;但这些方法的效果往往不稳定。随着技术的发展&#xff0c;现在有了更先进的解决方案——大模…

【学习笔记】SAP ABAP——子程序

子程序&#xff1a; 参数&#xff1a; 参数(Parameter)是指调用子程序时用于传入、传出的值。子程序中的参数与一般用 DATA语句定义的局部变量相同。调用子程序时使用的参数叫实参(Actual Parameter)&#xff0c;在子程序中使用的参数叫虚参(Formal Parameter)。PERFORM 利用…

计算机专业开题报告写法,该怎么写好?

不会写开题报告&#xff0c;或者想要一些论文模版的&#xff0c;欢迎评论&#xff0c;会第一时间给大家。 题报告是计算机专业大学毕业生在开展毕业设计或论文研究前&#xff0c;对研究课题进行详细介绍和计划的重要环节。作为开题者对科研课题的一种文字说明&#xff0c;开题…

Python世界:力扣题704二分查找

Python世界&#xff1a;力扣题704二分查找 任务背景思路分析代码实现测试套件本文小结 任务背景 问题来自力扣题目704&#xff1a;Binary Search&#xff0c;大意如下&#xff1a; Given an array of integers nums which is sorted in ascending order, and an integer target…

FreeRTOS学习日志--中断测试实验,以及遇到的问题

目录 实验项目&#xff1a;FreeRTOS 中断测试实验 1、实验目的 2、实验设计 遇到的问题 stm32F103战舰在运行程序后&#xff0c;USB232串口不能接收到信号问题。 从跑马灯FreeRTOS文件基础上移植的FreeRTOS中断无效&#xff0c;而例程中断有效问题。 问题来源与解决方法…

shodan[3](泷羽sec)

声明 学习视频来自B站UP主 泷羽sec,如涉及侵泷羽sec权马上删除文章。 笔记只是方便各位师傅学习知识,以下网站只涉及学习内容,其他的都与本人无关,切莫逾越法律红线,否则后果自负 这节课旨在扩大自己在网络安全方面的知识面&#xff0c;了解网络安全领域的见闻&#xff0c;了…

Windows系统服务器怎么设置远程连接?详细步骤

一、什么是Windows远程桌面连接? Windows远程桌面(Remote Desktop)功能使用户能够通过网络连接到另一台Windows计算机&#xff0c;实现远程操作。远程桌面非常适合系统管理员、技术支持人员以及那些需要远程工作的人&#xff0c;它允许用户以图形界面的方式访问远程计算机&…

Spring配置文件初始化加载(一)

1.枚举 public enum TestEnum {type_01("01", "zeroTest01ServiceImpl"),type_02("02", "zeroTest02ServiceImpl"),type_03("03", "zeroTest03ServiceImpl");private String type;private String pathClass; } …

Element UI组件Dialog显示闪动问题【解决方案】

在ElementUI中&#xff0c;el-dialog弹窗确实有时会导致页面出现抖动或闪动的问题。这通常是由于弹窗出现时对页面布局的影响&#xff0c;特别是滚动条的出现或消失&#xff0c;导致了页面的重新布局和渲染。以下是一些解决或缓解这一问题的方法&#xff1a; 解决方案 1. 关闭…

【022C】基于51单片机音乐盒

☆、设计硬件组成&#xff1a;51单片机最小系统按键控制LCD1602液晶显示DS18B20温度传感器喇叭。 1、本设计采用STC89C51/52、AT89C51/52、AT89S51/52作为主控芯片&#xff1b; 2、采用LCD1602显示播放歌曲名、歌曲序号、歌曲播放时间&#xff1b; 3、播放音乐通过按键可以实…

计算机毕业设计Python流量检测可视化 DDos攻击流量检测与可视化分析 SDN web渗透测试系统 网络安全 信息安全 大数据毕业设计

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…

BO-CNN-LSTM回归预测 | MATLAB实现BO-CNN-LSTM贝叶斯优化卷积神经网络-长短期记忆网络多输入单输出回归预测

BO-CNN-LSTM回归预测 | MATLAB实现BO-CNN-LSTM贝叶斯优化卷积神经网络-长短期记忆网络多输入单输出回归预测 目录 BO-CNN-LSTM回归预测 | MATLAB实现BO-CNN-LSTM贝叶斯优化卷积神经网络-长短期记忆网络多输入单输出回归预测效果一览基本介绍模型搭建程序设计参考资料 效果一览 …

基于统计方法的语言模型

基于统计方法的语言模型 基于统计方法的语言模型主要是指利用统计学原理和方法来构建的语言模型&#xff0c;这类模型通过分析和学习大量语料库中的语言数据&#xff0c;来预测词、短语或句子出现的概率。 N-gram模型&#xff1a;这是最基础的统计语言模型之一&#xff0c;它基…

基于Python+Vue开发的蛋糕商城管理系统

项目简介 该项目是基于PythonVue开发的蛋糕商城管理系统&#xff08;前后端分离&#xff09;&#xff0c;这是一项为大学生课程设计作业而开发的项目。该系统旨在帮助大学生学习并掌握Python编程技能&#xff0c;同时锻炼他们的项目设计与开发能力。通过学习基于Python的蛋糕商…

【node模块】深入解读node:assert模块

&#x1f9d1;‍&#x1f4bc; 一名茫茫大海中沉浮的小小程序员&#x1f36c; &#x1f449; 你的一键四连 (关注 点赞收藏评论)是我更新的最大动力❤️&#xff01; &#x1f4d1; 目录 &#x1f53d; 前言1️⃣ 什么是node:assert模块&#xff1f;2️⃣ node:assert模块的核心…

JDBC学习记录

文章目录 一、JDBC简介1.1、 JDBC概念1.2、 JDBC本质1.3、 JDBC好处 二、JDBC快速入门2.1、 编写代码步骤2.2、 代码示例 三、JDBC API详解3.1、DriverManager3.1.1、注册驱动3.1.2、获取连接 3.2、Connection3.2.1、获取执行对象3.2.2、事务管理 3.3、Statement3.3.1、执行DDL…

【物联网技术】ESP8266 WIFI模块在STA模式下实现UDP与电脑/手机网络助手通信——UDP数据透传

前言:完成ESP8266 WIFI模块在STA模式下实现UDP与电脑/手机网络助手通信——实现UDP数据透传 STA模式,通俗来说就是模块/单片机去连接路由器/热点来通信。 UDP协议,是传输层协议,UDP没有服务器和客户端的说法。 本实验需要注意,wifi模块/单片机与电脑/手机需要连接在同一个…

Linux和,FreeRTOS 任务调度原理,r0-r15寄存器,以及移植freertos(一)

目录、 1、r0-r15寄存器&#xff0c;保护现场&#xff0c;任务切换的原理 2、freertos移植 3、freertos的任务管理。 一、前言 写这篇文章的目的&#xff0c;是之前面试官&#xff0c;刚好问到我&#xff0c;移植FreeRTOS 到mcu&#xff0c;需要做哪些步骤&#xff0c;当时回…

安利一款开源企业级的报表系统SpringReport

SpringReport是一款企业级的报表系统&#xff0c;支持在线设计报表&#xff0c;并绑定动态数据源&#xff0c;无需写代码即可快速生成想要的报表&#xff0c;可以支持excel报表和word报表两种格式&#xff0c;同时还可以支持excel多人协同编辑&#xff0c;后续考虑实现大屏设计…

css:基础

前言 我们之前其实也可以写出一个看起来算是一个网页的网页&#xff0c;为什么我们还要学css&#xff1f; CSS&#xff08;Cascading Style Sheets&#xff09;也叫层叠样式表&#xff0c;是负责美化的&#xff0c;我们之前说html就是一个骨架&#xff0c;css就可以用来美化网…