02-MySQL 面试题-mk

news2025/4/19 9:44:13

文章目录

  • 1.mysql 有哪些存储引擎、区别是什么?
  • 1.如何定位慢查询?
  • 2.SQL语句执行很慢,如何分析?
  • 3.索引概念以及索引底层的数据结构
  • 4.什么是聚簇索引什么是非聚簇索引?
  • 5.知道什么叫覆盖索引嘛 ?
  • 6.索引创建原则有哪些?
  • 7.什么情况下索引会失效 ?
  • 8.谈一谈你对sql的优化的经验
  • 9.事务的特性有哪些?
  • 10.并发事务问题、隔离级别
  • 11.undo log和redo log的区别
  • 12.事务中的隔离性是如何保证的呢?什么是MVCC?
  • 13.MySQL主从同步原理
  • 14.分库分表
  • 15.分库分表,分库策略是什么?
  • 16.分库分表,除了hash分片还有别的吗?
  • 17.mysql锁

1.mysql 有哪些存储引擎、区别是什么?

mysql 有哪些存储引擎、区别是什么

1.如何定位慢查询?

什么是慢查询?
页面加载过慢、接口压测响应时间过长(超过1s)

慢查询出现的情况有哪些?

  • 聚合查询
  • 多表查询
  • 表数据量过大查询
  • 深度分页查询

如何定位慢查询?
方案一:开源工具

  • 调试工具:Arthas
  • 运维工具:Prometheus、Skywalking

Arthas:可以使用命令的方式来监控已经上线的项目,来跟踪比较慢的方法,查看方法执行时间,最终可以确定哪里出现问题
Skywalking:可以查看接口的响应情况(slow endpoints-访问越慢的接口拍在最前面),可以通过“追踪”功能来详细的查看接口的响应情况,可以查看在代码方法中和SQL查询中的耗时
在这里插入图片描述
在这里插入图片描述
方案二:MySQL自带慢查询日志
慢查询日志记录了所有执行时间超过指定参数(long_query_time,单位:秒,默认10秒)的所有SQL语句的日志,如果要开启慢查询日志,需要在MySQL的配置文件(/etc/my.cnf)中配置如下信息:

# 开启MySQL慢查询日志开关,1-开启,0-未开启
slow_query_log=1
# 设置慢查询日志的时间为2秒,SQL语句执行时间超过2秒,就会视为慢查询,记录慢查询日志
long_query_time=2

配置完毕之后,重启MySQL服务器后进行测试,查看慢日志文件中记录的信息 /var/lib/mysql/localhost-slow.log
在这里插入图片描述如何定位慢查询

  1. 介绍一下当时产生问题的场景(我们当时的一个接口测试的时候非常的慢,压测的结果大概5秒钟)
  2. 我们系统中当时采用了运维工具( Skywalking ),可以监测出哪个接口,最终因为是sql的问题
  3. 在mysql中开启了慢日志查询,我们设置的值就是2秒,一旦sql执行超过2秒就会记录到日志中(调试阶段,生产阶段不会开启)

面试参考回答:

嗯~,我们当时做压测的时候有的接口非常的慢,接口的响应时间超过了2秒以上,因为我们当时的系统部署了运维的监控系统Skywalking ,在展示的报表中可以看到是哪一个接口比较慢,并且可以分析这个接口哪部分比较慢,这里可以看到SQL的具体的执行时间,所以可以定位是哪个sql出了问题。

如果,项目中没有这种运维的监控系统,其实在MySQL中也提供了慢日志查询的功能,可以在MySQL的系统配置文件中开启这个慢日志的功能,并且也可以设置SQL执行超过多少时间来记录到一个日志文件中,我记得上一个项目配置的是2秒,只要SQL执行的时间超过了2秒就会记录到日志文件中,我们就可以在日志文件找到执行比较慢的SQL了。

2.SQL语句执行很慢,如何分析?

  • 聚合查询:优化SQL 语句,新增一个临时表解决
  • 多表查询:优化SQL 语句的结构
  • 表数据量过大查询:添加索引
  • 深度分页查询:提到覆盖索引再解决

聚合查询、多表查询、表数据量过大查询都可以通过SQL执行计划来找到执行慢的原因

一个SQL语句执行很慢, 如何分析?

可以采用EXPLAIN 或者 DESC命令获取 MySQL执行 SELECT 语句的信息

语法

-直接在select语句之前加上关键字 explain/desc
EXPLAIN SELECT 字段列表 FROM 表名 WHERE 条件;

在这里插入图片描述

  • possible_keys 当前sql可能会使用到的索引
  • key 当前sql实际命中的索引
  • key_len 索引占用的大小(通过key 和key_len 两个查看是否会命中索引和索引是否失效)
  • Extra 额外的优化建议 (也可以获取其它信息,如某条sql 使用索引的过程中,是否进行回表。如果Extra 返回的是 “Using index condition”表示当前索引的使用有优化的空间)
    在这里插入图片描述
  • type 这条sql的连接的类型,性能由好到差为NULL、system、const、eq_ref、ref、range、 index、all (左边性能越好,右边性能越差)
    • NULL:sql语句执行的时候,没有使用到表,平时开发中比较少见(无需关注)
    • system:查询系统中的表(mysql 中内置的表,很少用到)
    • const:根据主键查询
    • eq_ref:主键索引查询或唯一索引查询(查询出来是一条)
    • ref:索引查询(查询出来是多条)
    • range:范围查询
    • index:索引树扫描(全索引查询,才会遍历整个索引树)
    • all:全盘扫描(不走索引,并且是全盘扫描)

总结:在实际开发中最低限制在range,如果某个sql 连接类型是index和all 那这条sql需要优化

那这个SQL语句执行很慢, 如何分析呢?
可以采用MySQL自带的分析工具 EXPLAIN

  • 通过key和key_len检查是否命中了索引(索引本身存在是否有失效的情况)
  • 通过type字段查看sql是否有进一步的优化空间,是否存在全索引扫描(index)或全盘扫描(all)
  • 通过extra建议判断,是否出现了回表的情况,如果出现了,可以尝试添加索引修改返回字段来修复

面试参考回答:

候选人:如果一条sql执行很慢的话,我们通常会使用mysql自动的执行计划explain来去查看这条sql的执行情况,比如在这里面可以通过key和key_len检查是否命中了索引,如果本身已经添加了索引,也可以判断索引是否有失效的情况,第二个,可以通过type字段查看sql是否有进一步的优化空间,是否存在全索引扫描或全盘扫描,第三个可以通过extra建议来判断,是否出现了回表的情况,如果出现了,可以尝试添加索引或修改返回字段来修复

3.索引概念以及索引底层的数据结构

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

索引(index)是帮助MySQL高效获取数据数据结构(有序)。在数据之外,数据库系统还维护着满足特定查找算法的数据结构(B+树),这些数据结构以某种方式引用(指向)数据, 这样就可以在这些数据结构上实现高级查找算法,这种数据结构就是索引。

查找age=45的数据,左边会遍历整张表查找数据。右边是一个二叉树(二叉搜索树,左边小,右边大,查找age=45数据,比对次数少,效率提高,减少IO操作)
在这里插入图片描述索引的底层数据结构了解过嘛 ?

MySQL默认使用的索引底层数据结构是B+树

数据结构对比:
二叉树

二叉搜索树:时间复杂度O(logn)

最坏的二叉树:时间复杂度O(n),二叉树不太稳定,mysql底层没有使用二叉树

红黑树:节点可以保持平衡,时间复杂度相对稳定O(logn),假如一张表的数据量很大(1000万),红黑树也是一种二叉树,每个节点只能有两个子节点,如果把1000万的数据存入红黑树中,红黑树变得特别的高,如果要查找数据的话,需要找很多的层级才能找到想要的数据,所以红黑树的效率也不高
在这里插入图片描述
B树

B-Tree,B树是一种多叉路平衡查找树,相对于二叉树,B树每个节点可以有多个分支,即多叉。
以一颗最大度数(max-degree)为5(5阶,每个节点最多有5个子节点)的b-tree为例,那这个B树每个节点最多存储4个key(根节点上,20、30、62、89),和二叉树特点一样,左边小右边大,每个key都有指针(灰色部分),指向子节点的数据,每个key都存储了数据(绿色部分),相对二叉树,b树是一个矮胖树,由于他的分支比较多,查找层级较短,效率比较高。
在这里插入图片描述

B+树

B+Tree是在BTree基础上的一种优化,使其更适合实现外存储索引结构,InnoDB存储引擎(MySQL默认)就是用B+Tree实现其索引结构。
非叶子节点:只存储指针,不存储数据,起导航作用,导航找到下面叶子节点
叶子节点:存储数据
在这里插入图片描述
B树与B+树对比:

  • 磁盘读写代价B+树更低
  • 查询效率B+树更加稳定
  • B+树便于扫库和区间查询

为什么磁盘读写代价B+树更低?

非叶子节点只存储指针,不存储数据,相对来说存储压力较小。例如要查找12这条数据:

如果是b树,首先会找到根节点,比如找到38,然后把38的数据给查询出来,其中12要比38小,所以从左边找到16和29两个节点,进行对比,最终才能定位到12这个节点,这些节点是包含数据的,也会把38、16、29的数据给加载出来,现在我们只要12这个数据,它会额外加载其它数据。

如果是b+树,会在叶子节点存储数据,非叶子节点存储的是指针,这些指针为了方便查找叶子节点的数据,相当于是个导航,所以它的效率高很多。 整体来说b+树的磁盘读写更低一些。

为什么查询效率B+树更加稳定?

因为b+树所有的数据都存储在叶子节点上,在查找数据时都要从根节点一个一个往下对比,最终在叶子节点获取数据,查找路径是差不多的,效率比较稳定

B+树便于扫库和区间查询?

叶子节点之间使用双向指针进行连接,范围查询的时候更加方便,例如要查询6-34之间的数据,先从根节点上对比一次,从左边找到16,再从左边找到6,由于节点之间有双向指针,所有一次性把数据都能拿到,16、18、29、34不需要从根节点再找一次。

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

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

相关文章

#include<bits/stdc++.h>

#include<bits/stdc.h> 是 C 中一个特殊的头文件&#xff0c;其作用如下&#xff1a; 核心作用 ​​包含所有标准库头文件​​ 该头文件会自动引入 C 标准库中的几乎全部头文件&#xff08;如 <iostream>、<vector>、<algorithm> 等&#xff09;&…

在企业级部署中如何优化NVIDIA GPU和容器环境配置:最佳实践与常见误区20250414

在企业级部署中如何优化NVIDIA GPU和容器环境配置&#xff1a;最佳实践与常见误区 引言 随着AI和深度学习技术的迅速发展&#xff0c;企业对GPU加速计算的需求愈加迫切。在此过程中&#xff0c;如何高效地配置宿主机与容器化环境&#xff0c;特别是利用NVIDIA GPU和相关工具&…

Spring Boot 项目三种打印日志的方法详解。Logger,log,logger 解读。

目录 一. 打印日志的常见三种方法&#xff1f; 1.1 手动创建 Logger 对象&#xff08;基于SLF4J API&#xff09; 1.2 使用 Lombok 插件的 Slf4j 注解 1.3 使用 Spring 的 Log 接口&#xff08;使用频率较低&#xff09; 二. 常见的 Logger&#xff0c;logger&#xff0c;…

[react]Next.js之自适应布局和高清屏幕适配解决方案

序言 阅读前首先了解即将要用到的两个包的作用 1.postcss-pxtorem 自动将 CSS 中的 px 单位转换为 rem 单位按照设计稿尺寸直接写 px 值&#xff0c;由插件自动计算 rem 值 2.amfe-flexible 动态设置根元素的 font-size&#xff08;即 1rem 的值&#xff09;根据设备屏幕宽度和…

STM32H503CB升级BootLoader

首先&#xff0c;使用SWD接口&#xff0c;ST-LINK连接电脑和板子。 安装SetupSTM32CubeProgrammer_win64 版本2.19。 以下是接线和软件操作截图。

在Apple Silicon上部署Spark-TTS:四大核心库的技术魔法解析!!!

在Apple Silicon上部署Spark-TTS&#xff1a;四大核心库的技术魔法解析 &#x1f680; &#xff08;M2芯片实测&#xff5c;Python 3.12.9PyTorch 2.6.0全流程解析&#xff09; 一、核心库功能全景图 &#x1f50d; 在Spark-TTS的部署过程中&#xff0c;pip install numpy li…

VMWare 16 PRO 安装 Rocky8 并部署 MySQL8

VMWare 16 PRO 安装 Rocky8 并部署 MySQL8 一.Rocky OS 下载1.官网二.配置 Rocky1.创建新的虚拟机2.稍后安装系统3.选择系统模板4.设置名字和位置5.设置大小6.自定义硬件设置核心、运存和系统镜像7.完成三.启动安装1.上下键直接选择安装2.回车安装3.设置分区(默认即可)和 roo…

cursor如何回退一键回退多个文件的修改

当我们使用 Cursor 写代码时&#xff0c;起初可能操作得很顺利&#xff0c;但某次更改或许会让代码变得面目全非。这时候如果没有使用 Git 该怎么办呢&#xff1f;别担心&#xff0c;Cursor 已经为我们考虑到了。 具体的操作如下&#xff1a; 当我们要取消某次操作时&#xf…

基于RV1126开发板的口罩识别算法开发

1. 口罩识别简介 口罩识别是一种基于深度学习的判断人员有没有戴口罩的分类算法&#xff0c;能广泛的用于安防、生产安全等多种场景。本算法先基于人脸检测和人脸标准化获取的标准人脸&#xff0c;然后输入到口罩识别分类算法进行识别。 本人脸检测算法在数据集表现如下所示&am…

PyCharm显示主菜单和工具栏

显示主菜单 新版 PyCharm 是不显示主菜单的&#xff0c;要想显示主菜单和工具栏&#xff0c;则通过 “视图” → “外观” &#xff0c;勾选 “在单独的工具栏中显示主菜单” 和 “工具栏” 即可。 设置工具栏 此时工具栏里并没有什么工具&#xff0c;因此我们需要自定义工具…

Java工程行业管理软件源码 - 全面的项目管理工具 - 工程项目模块与功能一览

工程项目管理系统 Spring CloudSpring BootMybatisVueElementUI前后端分离构建工程项目管理系统 项目背景 随着公司的快速发展&#xff0c;企业人员和经营规模不断壮大。为了提高工程管理效率、减轻劳动强度、提高信息处理速度和准确性&#xff0c;公司对内部工程管理的提升提…

Redis 高可用集群搭建与优化实践

在分布式系统中,缓存技术用于提升性能和响应速度。 Redis 作为一款高性能的键值存储系统,广泛应用于缓存、消息队列和会话管理等场景。随着业务规模的扩大,单机 Redis 的性能和可用性逐渐无法满足需求。 因此,搭建高可用的 Redis 集群可以解决这一问题。我将详细介绍 Red…

【AI大模型】基于阿里百炼大模型进行调用

目录 一、认识阿里云百炼 模型广场 创建自己的模型 二、AI扩图示例 1、开头服务、设置秘钥 2、选择HTTP方式调用流程 3、创建任务请求示例 4、发送http请求提交任务 5、查看任务进度的流程设计 6、后端查看任务进度代码 三、总结 大家好&#xff0c;我是jstart千语…

【神经网络结构的组成】深入理解 转置卷积与转置卷积核

&#x1f308; 个人主页&#xff1a;十二月的猫-CSDN博客 &#x1f525; 系列专栏&#xff1a; &#x1f3c0;《深度学习理论直觉三十讲》_十二月的猫的博客-CSDN博客 &#x1f4aa;&#x1f3fb; 十二月的寒冬阻挡不了春天的脚步&#xff0c;十二点的黑夜遮蔽不住黎明的曙光 …

MyBatis-plus笔记 (上)

简介 [MyBatis-Plus]&#xff08;简称 MP&#xff09;是一个 [MyBatis]的增强工具&#xff0c;在 MyBatis 的基础上只做增强不做改变&#xff0c;为简化开发、提高效率而生。 mybatis-plus总结&#xff1a; 注意&#xff1a;mybatis-puls仅局限于单表操作。 自动生成单表的C…

大模型微调数据集怎么搞?基于easydataset实现文档转换问答对json数据集!

微调的难点之一在与数据集。本文介绍一种将文档转换为问答数据集的方法&#xff0c;超级快&#xff01; 上图左侧是我的原文档&#xff0c;右侧是我基于文档生成的数据集。 原理是通过将文档片段发送给ollama本地模型&#xff0c;然后本地模型生成有关问题&#xff0c;并基于文…

opencv 灰度实验

opencv 灰度实验 1. 最大值法2. 平均值法3. 加权均值法4(直接读取灰度图)cv2.IMREAD_GRAYSCALE5内置将原图转换为灰度图cv2.cvtColor()6 两个极端的灰度值 灰度图与彩色图最大的不同就是&#xff1a;彩色图是由R、G、B三个通道组成&#xff0c;而灰度图只有一个通道&#xff0c…

高性能内存kv数据库Redis(续)

目录 四.主从同步与对象模型 1.Redis 淘汰策略 2.Redis 如何做到 持久化 2.1 redis为什么要实现持久化 2.2fork进程的写时复制机制 2.3大Key的影响 2.4redis做持久化的方式 2.5 aof 2.6 rdb 2.7 redis 持久化方式的优缺点 3.redis里面的高可用体现在哪里&#xff1f; 3.1r…

【指纹浏览器系列-chromium编译】

本文提供了一步一步的指导来帮助读者在Windows环境下成功编译Chromium浏览器。涵盖了系统需求、开发环境搭建、代码下载及构建等关键步骤。 官方编译文档&#xff1a;https://github.com/chromium/chromium/blob/main/docs/windows_build_instructions.md 一、系统要求 一台…

Docker华为云创建私人镜像仓库

Docker华为云创建私人镜像仓库 在华为云官网的 产品 中搜索 容器镜像服务 &#xff1a; 或者在其他页面的搜索栏中搜索 容器镜像服务 &#xff1a; 进入到页面后&#xff0c;点击 创建组织 &#xff08;华为云的镜像仓库称为组织&#xff09;&#xff1a; 设置组织名字后&…