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

【Java 面试 八股文】MySQL 篇

MySQL 篇

    • 1. MySQL中,如何定位慢查询?
    • 2. 那这个SQL语句执行很慢,如何分析呢?
    • 3. 了解过索引吗?(什么是索引)
    • 4. 索引的底层数据结构了解过吗?
    • 5. B树和B+树的区别是什么呢?
    • 6. 什么是聚簇索引什么是非聚簇索引?
    • 7. 知道什么是回表查询吗?
    • 8. 知道什么叫覆盖索引吗?
    • 9. MySQL超大分页怎么处理?
    • 10. 索引创建原则有哪些?
    • 11. 什么情况下索引会失效?
    • 12. SQL的优化经验有哪些?
    • 13. 创建表的时候,你们是如何优化的呢?
    • 14. 在使用索引的时候,是如何优化呢?
    • 15. 你平时对SQL语句做了哪些优化呢?
    • 16. 事务的特性是什么?可以详细说一下吗?
    • 17. 并发事务带来哪些问题?
    • 18. 怎么解决这些问题呢?MySQL的默认隔离级别是?
    • 19. undo log和redo log的区别是什么?
    • 20. 事务中的隔离性是如何保证的呢?(你解释一下MVCC)
    • 21. MySQL主从同步原理是什么?
    • 22. 你们项目用过MySQL的分库分表吗?
    • 23. 那你之前使用过水平分库吗?

1. MySQL中,如何定位慢查询?

候选人:
嗯,我们当时在做压力测试时发现有些接口响应时间非常慢,超过了2秒。因为我们的系统部署了运维监控系统 Skywalking,在它的报表展示中可以看到哪个接口慢,并且能分析出接口中哪部分耗时较多,包括具体的SQL执行时间,这样就能定位到出现问题的SQL。

如果没有这种监控系统,MySQL本身也提供了 慢查询日志功能。可以在MySQL的系统配置文件中开启慢查询日志(调试阶段),并设置SQL执行时间超过多少就记录到日志文件,比如我们之前项目设置的是2秒,超过这个时间的SQL就会记录在日志文件中,我们就可以在那里找到执行慢的SQL。

2. 那这个SQL语句执行很慢,如何分析呢?

候选人:如果一条SQL执行很慢,我们通常会使用MySQL的 EXPLAIN 命令来分析这条SQL的执行情况。

  • 通过 keykey_len 可以 检查是否命中了索引,如果已经添加了索引,也可以判断索引是否有效。
  • 通过 type 字段可以查看SQL 是否有优化空间,比如是否存在全索引扫描或全表扫描。
  • 通过extra 建议可以判断是否出现回表情况,如果出现,可以尝试添加索引或修改返回字段来优化。

3. 了解过索引吗?(什么是索引)

候选人:嗯,索引在项目中非常常见,它是一种帮助MySQL 高效获取数据数据结构,主要用来提高数据检索效率,降低数据库的I/O成本。同时,索引列可以对数据进行排序,降低数据排序的成本,也能减少CPU的消耗。

4. 索引的底层数据结构了解过吗?

候选人:MySQL的默认存储引擎 InnoDB 使用的是 B+树 作为索引的存储结构。选择B+树的原因包括:

  • 节点可以有更多子节点,路径更短;
  • 磁盘读写代价更低,非叶子节点只存储键值和指针,叶子节点存储数据;
  • B+树适合范围查询和扫描,因为叶子节点形成了一个双向链表。

5. B树和B+树的区别是什么呢?

候选人:B树和B+树的主要区别在于:

  1. B树的非叶子节点和叶子节点都存放数据,而B+树的所有 数据只出现在叶子节点,这使得B+树在查询时效率更稳定。
  2. B+树在进行范围查询时效率更高,因为所有数据都在叶子节点,并且 叶子节点之间形成了双向链表

6. 什么是聚簇索引什么是非聚簇索引?

候选人:
聚簇索引 (聚集索引)是指 数据与索引放在一起,B+树的叶子节点保存了整行数据,通常只有一个聚簇索引,一般是由主键构成。
非聚簇索引(二级索引)则是数据与索引分开存储B+树的叶子节点保存的是主键值,可以有多个非聚簇索引,通常我们自定义的索引都是非聚簇索引。
请添加图片描述

7. 知道什么是回表查询吗?

候选人:回表查询是指通过二级索引找到对应的主键值,然后再通过主键值查询聚簇索引中对应的整行数据的过程。

8. 知道什么叫覆盖索引吗?

候选人:覆盖索引是指在SELECT查询中,返回的列全部能在索引中找到,避免了回表查询,提高了性能。 使用覆盖索引可以减少对主键索引的查询次数,提高查询效率。

9. MySQL超大分页怎么处理?

候选人:超大分页通常发生在数据量大的情况下,使用LIMIT分页查询且需要排序时效率较低。可以通过 覆盖索引子查询 来解决。首先查询数据的ID字段进行分页,然后根据ID列表用子查询来过滤只查询这些ID的数据,因为查询ID时使用的是覆盖索引,所以效率可以提升。

10. 索引创建原则有哪些?

候选人:创建索引的原则包括:

  • 表中的数据量超过10万以上时考虑创建索引。
  • 选择查询频繁的字段作为索引,如查询条件、排序字段或分组字段。
  • 尽量使用复合索引,覆盖SQL的返回值。
  • 如果字段区分度不高,可以将其放在组合索引的后面。
  • 对于内容较长的字段,考虑使用前缀索引。
  • 控制索引数量,因为索引虽然可以提高查询速度,但也会影响插入、更新的速度。

11. 什么情况下索引会失效?

候选人:索引可能在以下情况下失效:

  • 没有遵循最左匹配原则。 指的是查询从索引的最左前列开始,并且不跳过索引中的列。
  • 使用了模糊查询且%号在前面。
  • 在索引字段上进行了运算或类型转换。
  • 使用了复合索引但在中间使用了范围查询,导致右边的条件索引失效。
  • 字符串不加单引号,导致类型转换。

通常情况下,想要判断 SQL 是否有索引失效的情况,可以使用 explain 执行计划来分析。

12. SQL的优化经验有哪些?

候选人:SQL优化可以从以下几个方面考虑:

  • 表的设计优化,建表时选择合适的字段类型。
  • 索引优化,遵循创建索引的原则。
  • SQL语句优化,比如避免使用SELECT *,尽量使用UNION ALL代替UNION,以及在表关联时使用INNER JOIN。
  • 采用主从复制和读写分离提高性能。
  • 在数据量大时考虑分库分表。

13. 创建表的时候,你们是如何优化的呢?

候选人:创建表时,我们主要参考《嵩山版》开发手册,选择字段类型时结合字段内容,比如数值类型选择TINYINT、INT、BIGINT等,字符串类型选择CHAR(定长效率高)、VARCHAR(可变长度效率稍低)或TEXT。

14. 在使用索引的时候,是如何优化呢?

候选人:在使用索引时,我们 遵循索引创建原则,确保索引字段是查询频繁的,使用复合索引覆盖SQL返回值,避免在索引字段上进行运算或类型转换,以及控制索引数量。

15. 你平时对SQL语句做了哪些优化呢?

候选人:我对SQL语句的优化包括

  • 指明字段名称而不是使用SELECT *
  • 避免造成索引失效的写法
  • 聚合查询时使用UNION ALL代替UNION
  • 表关联时优先使用INNER JOIN,以及在必须使用LEFT JOIN或RIGHT JOIN时,确保小表作为驱动表。

16. 事务的特性是什么?可以详细说一下吗?

候选人:事务的特性是 ACID,即 原子性(Atomicity)一致性(Consistency)隔离性(Isolation)持久性(Durability)。例如,A向B转账500元,这个操作要么都成功,要么都失败,体现了原子性。转账过程中数据要保持一致,A扣除了500元,B必须增加500元。隔离性体现在A向B转账时,不受其他事务干扰。持久性体现在事务提交后,数据要被持久化存储。
在这里插入图片描述

17. 并发事务带来哪些问题?

候选人:并发事务可能导致脏读不可重复读幻读

  • 脏读是指一个事务读到了另一个事务未提交的“脏数据”。
  • 不可重复读是指在一个事务内多次读取同一数据,由于其他事务的修改导致数据不一致。
  • 幻读是指一个事务读取到了其他事务插入的“幻行”。

18. 怎么解决这些问题呢?MySQL的默认隔离级别是?

候选人:解决这些问题的方法是使用 事务隔离。MySQL支持四种隔离级别:

  1. 未提交读(READ UNCOMMITTED):解决不了所有问题。
  2. 读已提交(READ COMMITTED):能解决脏读,但不能解决不可重复读和幻读。
  3. 可重复读(REPEATABLE READ):能解决脏读和不可重复读,但不能解决幻读,这也是MySQL的默认隔离级别
  4. 串行化(SERIALIZABLE):可以解决所有问题,但性能较低。

19. undo log和redo log的区别是什么?

候选人:
redo log记录的是数据页的物理变化,用于服务宕机后的恢复,保证事务的持久性
undo log记录的是逻辑日志,用于事务回滚时恢复原始数据,保证事务的原子性和一致性

20. 事务中的隔离性是如何保证的呢?(你解释一下MVCC)

候选人:事务的隔离性通过 多版本并发控制(MVCC) 来保证。MVCC通过维护数据的多个版本来避免读写冲突。底层实现包括 隐藏字段undo logread view

  • 隐藏字段包括 trx_idroll_pointer
    • trx_id (事务id),记录每一次操作的事务id,是自增的。
    • roll_pointer(回滚指针),指向上一个版本的事务版本记录地址。
  • undo log记录了不同版本的数据,通过roll_pointer形成版本链。
    • 回滚日志,存储老版本数据。
    • 版本链:多个事务并行操作某一行记录,记录不同事务修改数据的版本,通过 roll_pointer 形成一个链表。
  • read view 定义了不同隔离级别下的快照读,决定了事务访问哪个版本的数据。
    • 根据 readView 的匹配规则和当前的一些事务 id 判断该访问哪个版本的数据。
    • 不同的隔离级别快照读是不一样的,最终的访问的结果不一样。
      • RC(读已提交):每一次执行快照读时生成 readView
      • RR(可重复读):仅在事务中第一次执行快照读时生成ReadView,后续复用。

21. MySQL主从同步原理是什么?

候选人:MySQL主从复制的核心是 二进制日志(Binlog)
Binlong 记录了所有的 DDL(数据定义语言)语句和 DML(数据操纵语言)语句,但不包括数据查询(SELECT、SHOW)语句。步骤如下:

  1. 主库在事务提交时记录数据变更到 Binlog。
  2. 从库读取主库的Binlog并写入中继日志(Relay Log)
  3. 从库重做中继日志中的事件,反映到自己的数据中。

22. 你们项目用过MySQL的分库分表吗?

候选人:我们采用微服务架构,每个微服务对应一个数据库,是根据业务进行拆分的,这个其实就是垂直拆分

23. 那你之前使用过水平分库吗?

候选人:使用过。当时业务发展迅速,某个表数据量超过1000万,单库优化后性能仍然很慢,因此采用了水平分库。我们首先部署了3台服务器和3个数据库,使用mycat进行数据分片。旧数据也按照ID取模规则迁移到了各个数据库中,这样各个数据库可以分摊存储和读取压力,解决了性能问题。

在这里插入图片描述

相关文章:

【Java 面试 八股文】MySQL 篇

MySQL 篇 1. MySQL中,如何定位慢查询?2. 那这个SQL语句执行很慢,如何分析呢?3. 了解过索引吗?(什么是索引)4. 索引的底层数据结构了解过吗?5. B树和B树的区别是什么呢?6.…...

ES6 Proxy 用法总结以及 Object.defineProperty用法区别

Proxy 是 ES6 引入的一种强大的拦截机制,用于定义对象的基本操作(如读取、赋值、删除等)的自定义行为。相较于 Object.defineProperty,Proxy 提供了更灵活、全面的拦截能力。 1. Proxy 语法 const proxy new Proxy(target, hand…...

vue中使用高德地图自定义掩膜背景结合threejs

技术架构 vue3高德地图2.0threejs 代码步骤 这里我们就用合肥市为主要的地区,将其他地区扣除,首先使用高德的webapi的DistrictSearch功能,使用该功能之前记得检查一下初始化的时候是否添加到plugins中,然后搜索合肥市的行政数据…...

tomcat如何配置保存7天滚动日志

在 Tomcat 中,logging.properties 文件是用于配置 Java 日志框架(java.util.logging)的。若要实现 catalina.out 日志保存 7 天,且每天的日志文件名带有时间戳,可以按以下步骤进行配置: 1. 备份原配置 在修…...

ffmpeg -pix_fmts

1. ffmpeg -pix_fmts -loglevel quiet 显示ffmpeg支持的像素格式 2. 输出 选取部分输出结果 Pixel formats: I.... Supported Input format for conversion .O... Supported Output format for conversion ..H.. Hardware accelerated format ...P. Paletted format ..…...

Python----PyQt开发(PyQt高级:图像显示,定时器,进度条)

一、图像显示 1.1、增加图标 1.直接创建setWindowIcon(QIcon(灯泡.jpg)) import sys from PyQt5.QtWidgets import QApplication, QMainWindow, QPushButton from PyQt5.QtGui import QIconclass MainWindow(QMainWindow):def __init__(self):super(MainWindow, self).__init_…...

Tomcat添加到Windows系统服务中,服务名称带空格

要将Tomcat添加到Windows系统服务中,可以通过Tomcat安装目录中“\bin\service.bat”来完成,如果目录中没有service.bat,则需要使用其它方法。 打到CMD命令行窗口,通过cd命令跳转到Tomcat安装目录的“\bin\”目录,然后执…...

2025.2.10 每日学习记录3:技术报告只差相关工作+补实验

0.近期主任务线 1.完成小论文准备 目标是3月份完成实验点1的全部实验和论文。 2.准备教资笔试 打算留个十多天左右,一次性备考笔试的三个科目 1.实习申请技术准备:微调、Agent、RAG 据央视财经,数据显示,截至2024年12月…...

普通用户授权docker使用权限

1、检查docker用户组 sudo cat /etc/group |grep docker 若显示:docker:x:999: # 表示存在否则创建docker用户组: sudo groupadd docker2、查看 /var/run/docker.sock 的属性 ll /var/run/docker.sock 显示: srw-rw---- 1 root root 0 1月…...

微生物学术语和定义 | 微生物学词汇表

​ 微生物学作为一门研究微生物及其与环境、宿主和其他生物相互作用的科学,涵盖了广泛的学科领域和专业术语。然而,由于微生物学的快速发展和跨学科融合,许多术语的定义和使用在不同领域中可能存在差异甚至混淆。 随着新冠疫情的全球蔓延&am…...

Java集合List详解(带脑图)

允许重复元素,有序。常见的实现类有 ArrayList、LinkedList、Vector。 ArrayList ArrayList 是在 Java 编程中常用的集合类之一,它提供了便捷的数组操作,并在动态性、灵活性和性能方面取得了平衡。如果需要频繁在中间插入和删除元素&#xf…...

后盾人JS -- 异步编程,宏任务与微任务

异步加载图片体验JS任务操作 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title&g…...

Go语言的内存分配原理

Go语言的内存分配原理 Go语言的内存管理分为两个主要区域&#xff1a;栈&#xff08;Stack&#xff09; 和 堆&#xff08;Heap&#xff09;。理解这两个区域的工作原理&#xff0c;可以帮助你写出更高效的代码&#xff0c;并避免一些常见的性能问题。 1. 栈&#xff08;Stac…...

分层解耦-ioc引入

内聚: 软件中各个功能模块内部的功能联系。 耦合: 衡量软件中各个层/模块之间的依赖、关联的程度。 软件设计原则: 高内聚低耦合。...

【知识科普】CPU,GPN,NPU知识普及

CPU,GPU,NPU CPU、GPU、NPU 详解1. CPU&#xff08;中央处理器&#xff09;2. GPU&#xff08;图形处理器&#xff09;3. NPU&#xff08;神经网络处理器&#xff09; **三者的核心区别****协同工作示例****总结** CPU、GPU、NPU 详解 1. CPU&#xff08;中央处理器&#xff0…...

【管理与实物】1.1.1 建筑物分类与构成

1.1.1 建筑物分类与构成 建筑物的分类建筑物的构成 一、课前学习建议 民用建筑的分类&#xff1a;根据《民用建筑设计统一标准》GB50352-2019 划分可划分为单层或多层民用建筑、高层民用建筑、超高层民用建筑&#xff1b;根据《建筑设计防火规范》GB50016-2014&#xff08;2…...

CentOS虚机在线扩容系统盘数据盘

最近在制作Openstack下的镜像&#xff0c;用户需要CentOS6以及CentOS7的虚机镜像&#xff0c;遇到了些关于系统盘以及数据盘在线扩容的问题&#xff0c;故此整理一下。 ​ 传统我们想对磁盘在线热扩容&#xff0c;必然会想到LVM逻辑卷。如果没有LVM逻辑卷的情况下&#xff0c;…...

使用Kickstart配置文件封装操作系统实现Linux的自动化安装

使用Kickstart配置文件封装操作系统实现Linux的自动化安装 创建ks.cfg配置文件 可以使用已经安装完成的Linux操作系统中的/root目录下的anaconda.cfg配置文件 注意&#xff0c;配置文件会因为kickstart的版本兼容性的问题导致无法安装报错需要在实际使用过程中删除某些参数 …...

如何利用DeepSeek开源模型打造OA系统专属AI助手

利用DeepSeek开源模型打造OA系统专属AI助手&#xff0c;可以显著提升办公效率&#xff0c;增强信息检索和管理能力。 注册与登录DeepSeek平台 访问DeepSeek官网 访问DeepSeek的官方网站DeepSeek。使用电子邮件或手机号码注册账号并登录。 获取API Key 登录DeepSeek平台&am…...

【20250211】栈与队列:1047.删除字符串中的所有相邻重复项

#方法一&#xff1a;使用栈 # class Solution: # def removeDuplicates(self, s): # res [] # for char in s: # #真和消消乐一样&#xff0c;栈外来一个数据&#xff0c;如果和栈顶数据相同&#xff0c;则不仅不入栈&#xff0c;还把栈顶数据…...

使用Hexo部署NexT主体网站

一.使用git提交文件 参考&#xff1a; 从零开始搭建个人博客&#xff08;超详细&#xff09; - 知乎 致谢&#xff01; 第一种&#xff1a;本地没有 git 仓库 直接将远程仓库 clone 到本地&#xff1b;将文件添加并 commit 到本地仓库&#xff1b;将本地仓库的内容push到远程仓…...

uni getLocation 公众号h5获取定位坐标没有返回

先看代码 //获取经纬度getLocation() {console.log("111")uni.getLocation({type: wgs84,success: function (res) {console.log(当前位置的经度&#xff1a; res.longitude);console.log(当前位置的纬度&#xff1a; res.latitude);},fail: function(err) {conso…...

C语言基本概念————讨论sqrt()和pow()函数与整数的关系

本文来源&#xff1a;C语言基本概念——讨论sqrt()和pow()函数与整数的关系. C语言基本概念——sqrt和pow函数与整数的关系 1. 使用sqrt()是否可以得到完全平方数的精确的整数平方根1.1 完全平方数的计算结果是否精确&#xff1f;1.2 为什么不会出现误差&#xff08;如 1.99999…...

【时时三省】(C语言基础)什么是算法

山不在高&#xff0c;有仙则名。水不在深&#xff0c;有龙则灵。 ----CSDN 时时三省 一个程序主要包括以下两方面的信息&#xff1a; &#xff08;1&#xff09;对数据的描述。在程序中&#xff0c;要指定用到哪些数据&#xff0c;以及这些数据的类型和数据组织形式。这就是数…...

Spring Boot 中加载多个 YAML 配置文件

在 Spring Boot 中加载多个 YAML 配置文件是一个常见的需求&#xff0c;通常用于将配置信息分离到多个文件中以便于管理和维护。Spring Boot 提供了灵活的方式来加载多个 YAML 配置文件。 以下是一些方法和步骤&#xff0c;用于在 Spring Boot 应用中加载多个 YAML 配置文件&a…...

IPoIB模块初始化过程详解

在现代网络环境中,InfiniBand over IP (IPoIB) 作为一种高性能的网络技术,被广泛应用于数据中心和高性能计算领域。为了确保其稳定性和高效性,Linux内核中的IPoIB模块在加载时需要进行一系列复杂的初始化操作。本文将基于一系列技术对话内容,详细介绍IPoIB模块的初始化流程…...

C语言——排序(冒泡,选择,插入)

基本概念 排序是对数据进行处理的常见操作&#xff0c;即将数据按某字段规律排列。字段是数据节点的一个属性&#xff0c;比如学生信息中的学号、分数等&#xff0c;可针对这些字段进行排序。同时&#xff0c;排序算法有稳定性之分&#xff0c;若两个待排序字段一致的数据在排序…...

如何本地部署DeepSeek

第一步&#xff1a;安装ollama https://ollama.com/download 打开官网&#xff0c;选择对应版本 第二步&#xff1a;选择合适的模型 https://ollama.com/ 模型名称中的 1.5B、7B、8B 等数字代表模型的参数量&#xff08;Parameters&#xff09;&#xff0c;其中 B 是英文 B…...

Docker 部署 MySQL-5.7 单机版

一、镜像获取 # docker hub 镜像 docker pull farerboy/mysql:5.7 # 国内阿里镜像 docker pull registry.cn-hangzhou.aliyuncs.com/farerboy/mysql:5.7 以上两个镜像二选一即可 二、运行容器 docker run -dti --name mysql \n --privileged \n --cgroupns private \n --e…...

正则表达式--元字符-限定符(4)

正则的限定元字符 表示前边一个符号代表的内容出现多少次 1.* ------ 表示0~正无穷次 2. ------ 表示 1~正无穷次 3. ? ------ 表示 0~1次 4. {n} ------ 表示 限定 n 次, 不能多也不能少 5. {n,} ------ 表示 最少 n 次 6. {n,m} ------ 表示 最少 n 次, 最多 m 次 <!DO…...