MySQL数据库面试题:如何定位慢查询?

MySQL数据库面试题:如何定位慢查询?

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

面试官:MySQL中,如何定位慢查询?
候选人:嗯~,我们当时做压测的时候有的接口非常的慢,接口的响应时间超过了2秒以上,因为我们当时的系统部署了运维的监控系统Skywalking ,在展示的报表中可以看到是哪一个接口比较慢,并且可以分析这个接口哪部分比较慢,这里可以看到SQL的具体的执行时间,所以可以定位是哪个SQL出了问题。如果项目中没有这种运维的监控系统,其实在MySQL中也提供了慢日志查询的功能,可以在MySQL的系统配置文件中开启这个慢日志的功能,并且也可以设置SQL执行超过多少时间来记录到一个日志文件中,我记得上一个项目配置的是2秒,只要SQL执行的时间超过了2秒就会记录到日志文件中,我们就可以在日志文件找到执行比较慢的SQL了。

面试官:那这个SQL语句执行很慢,如何分析呢?
候选人:如果一条SQL执行很慢的话,我们通常会使用MySQL自带的执行计划EXPLAIN来查看这条SQL的执行情况。通过EXPLAIN可以查看到SQL的执行计划,包括索引使用情况、表扫描次数、表连接方式等。具体可以从以下几个方面进行分析:

  1. 索引使用情况:查看keykey_len,检查是否命中了索引。如果使用了索引,可以判断索引是否有失效的情况。
  2. 查询类型:查看type字段,判断是否存在全索引扫描或全盘扫描,可以进一步优化SQL。
  3. 回表查询:查看extra字段,判断是否出现了回表的情况,如果出现了,可以尝试添加索引或修改返回字段来修复。
    在这里插入图片描述

面试官:了解过索引吗?(什么是索引)
候选人:嗯,索引在项目中还是比较常见的,它是帮助MySQL高效获取数据的数据结构,主要用于提高数据检索的效率,降低数据库的IO成本。同时,通过索引列对数据进行排序,降低数据排序的成本,也能降低了CPU的消耗。

面试官:索引的底层数据结构了解过嘛?
候选人:MySQL的默认存储引擎InnoDB采用的是B+树的数据结构来存储索引。选择B+树的主要原因有三个方面:第一,B+树的阶数更多,路径更短;第二,磁盘读写代价更低,非叶子节点只存储指针,叶子节点存储数据;第三,B+树便于扫库和区间查询,叶子节点是一个双向链表。

面试官:B树和B+树的区别是什么呢?
候选人:B树和B+树都是多路搜索树,但在实际应用中有一些区别:

  1. 存储数据位置:在B树中,非叶子节点和叶子节点都会存放数据,而B+树的所有数据都出现在叶子节点。
  2. 范围查询效率:在进行范围查询时,B+树效率更高,因为B+树的所有数据都在叶子节点存储,并且叶子节点是一个双向链表,更适合范围查询。

面试官:什么是聚簇索引,什么是非聚簇索引?
候选人:好的~,聚簇索引主要是指数据与索引放到一块,B+树的叶子节点保存了整行数据,有且只有一个。一般情况下,主键作为聚簇索引的索引字段。

非聚簇索引是数据与索引分开存储,B+树的叶子节点保存对应的主键,可以有多个。一般我们自己定义的索引都是非聚簇索引。
在这里插入图片描述

面试官:知道什么是回表查询嘛?
候选人:嗯,其实跟刚才介绍的聚簇索引和非聚簇索引是有关系的。回表的意思就是通过二级索引找到对应的主键值,然后再通过主键值找到聚簇索引中所对应的整行数据,这个过程就是回表。

【备注:如果面试官直接问回表,则需要先介绍聚簇索引和非聚簇索引】

面试官:知道什么叫覆盖索引嘛?
候选人:嗯~,清楚的。覆盖索引是指SELECT查询语句使用了索引,在返回的列必须在索引中全部能够找到。如果我们使用id查询,它会直接走聚簇索引查询,一次索引扫描,直接返回数据,性能高。

如果按照二级索引查询数据时,返回的列中没有创建索引,有可能会触发回表查询。尽量避免使用SELECT *,尽量在返回的列中都包含添加索引的字段。

面试官:MySQL超大分页

怎么处理?
候选人:嗯,超大分页一般是在数据量比较大时,我们使用了LIMIT分页查询,并且需要对数据进行排序。这个时候效率就很低。我们可以采用覆盖索引和子查询来解决。

先分页查询数据的id字段,确定了id之后,再用子查询来过滤,只查询这个id列表中的数据就可以了。因为查询id的时候,走的覆盖索引,所以效率可以提升很多。
在这里插入图片描述

面试官:索引创建原则有哪些?
候选人:嗯,索引的创建需要谨慎,毕竟添加索引也会导致新增改的速度变慢。通常情况下,我们会从以下几个方面考虑:

  1. 数据量:表中数据量超过10万以上,考虑创建索引。
  2. 查询频率:添加索引的字段是查询比较频繁的字段,例如作为查询条件、排序字段或分组的字段。
  3. 复合索引:使用复合索引来创建,尽量使用覆盖索引,将返回的列都包含在添加索引的字段中。
  4. 类型选择:字段的类型选择也要结合字段内容来选择合适的类型,例如数值类型和字符串类型。
  5. 索引数量控制:索引的数量也要控制,避免过多的索引导致查询性能下降。

面试官:什么情况下索引会失效?
候选人:嗯,索引失效的情况比较多,我说一些自己的经验。常见的失效情况有:

  1. 最左前缀原则:如果索引的最左前缀没有被用到,索引会失效。
  2. 模糊查询:如果%号在前面,索引会失效。
  3. 运算操作或类型转换:如果在添加索引的字段上进行了运算操作或者类型转换,索引会失效。
  4. 范围查询:在复合索引中,如果左边的字段使用了范围查询,右边的条件索引会失效。
  5. 字段类型:字段类型的选择也会影响索引是否失效。

所以,通常情况下,想要判断这条SQL是否有索引失效的情况,可以使用EXPLAIN执行计划来分析。
在这里插入图片描述

面试官:SQL的优化经验?
候选人:嗯,这个在项目还是挺常见的,当然如果直说SQL优化的话,我们会从以下几方面考虑:

  1. 建表优化:在定义字段时结合字段的内容来选择合适的类型,根据实际情况选择数值类型或字符串类型等。
  2. 索引使用:合理使用索引,选择适当的字段作为索引字段,尽量使用覆盖索引来提高查询性能。
  3. SQL编写:优化SQL语句的编写,避免模糊查询的使用,尽量在返回的列中包含添加索引的字段。
  4. 主从复制与读写分离:考虑主从复制和读写分离来分担数据库的读写压力。
  5. 分库分表:如果数据量较大,可以考虑分库分表来优化查询性能。

面试官:创建表的时候,你们是如何优化的呢?
候选人:这个我们主要参考的阿里出的那个开发手册《嵩山版》。例如,在定义字段时需要结合字段的内容来选择合适的类型,如果是数值类型,选择TINYINTINTBIGINT等类型,根据实际情况选择。如果是字符串类型,也是结合存储的内容来选择CHARVARCHAR或者TEXT类型等。遵循开发手册的规范,可以提高表的查询性能和存储效率。

在这里插入图片描述

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

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

相关文章

Linux命令(59)之screen

linux命令之screen 1.screen介绍 linux命令screen是用来进行多窗口管理。 默认screen命令没有安装,安装命令(基于yum源):yum install -y screen 2.screen用法 screen [参数] screen参数 参数说明-r恢复离线的screen作业-ls显示所有的screen作业 3.…

echarts 饼图的label放置于labelLine引导线上方

一般的饼图基础配置后长这样。 想要实现将文本放置在引导线上方,效果长这样 const options {// ...series: [{label: {padding: [0, -40],},labelLine: {length: 10,length2: 50,},labelLayout: {verticalAlign: "bottom",dy: -10,},},], };label.padd…

Zip压缩包密码忘记了,怎么办?

Zip压缩包设置了密码,解压的时候就需要输入正确对密码才能顺利解压出文件,正常当我们解压文件或者删除密码的时候,虽然方法多,但是都需要输入正确的密码才能完成。忘记密码就无法进行操作。 那么,忘记了zip压缩包的密…

CNN成长路:从AlexNet到EfficientNet(01)

一、说明 在 10年的深度学习中,进步是多么迅速!早在 2012 年,Alexnet 在 ImageNet 上的准确率就达到了 63.3% 的 Top-1。现在,我们超过90%的EfficientNet架构和师生训练(teacher-student)。 如果我们在 Ima…

基于C#的应用程序单例唯一运行的完美解决方案 - 开源研究系列文章

今次介绍一个应用程序单例唯一运行方案的代码。 我们知道,有些应用程序在操作系统中需要单例唯一运行,因为程序多开的话会对程序运行效果有影响,最基本的例子就是打印机,只能运行一个实例。这里将笔者单例运行的代码共享出来&…

实现5*5正方形网格x轴和y轴显示对应数值组件封装

实现5*5正方形网格x轴和y轴显示对应数值组件封装 需求&#xff1a;按5*5的正方形网格&#xff0c;根据目标数据的x和y轴值显示对应的文字&#xff0c;实现效果图如下&#xff1a;&#xff08;当前目标数值&#xff1a;x2&#xff0c;y2&#xff09; 代码如下&#xff1a; <…

分布式系统:ACID与CAP

ACID: 在计算机科学中&#xff0c;ACID是数据库事务的一组特性&#xff0c;旨在保证数据的有效性&#xff0c;即使在出现错误、断电和其他意外情况下也能保持数据的一致性。在数据库的上下文中&#xff0c;满足ACID属性的一系列数据库操作&#xff08;可以被视为对数据的单一逻…

【云原生】K8S二进制搭建三:高可用配置

目录 一、部署CoreDNS二、配置高可用三、配置负载均衡四、部署 Dashboard 一、部署CoreDNS 在所有 node 节点上操作 #上传 coredns.tar 到 /opt 目录中 cd /opt docker load -i coredns.tar在 master01 节点上操作 #上传 coredns.yaml 文件到 /opt/k8s 目录中&#xff0c;部…

servlet生命周期和初始化参数传递

servlet生命周期和初始化参数传递 1、servlet生命周期 只有第一次访问才会初始化&#xff0c;之后访问都只执行service中的。 除非tomcat关闭重新启动&#xff1a; 2、初始化参数传递

决策树与随机森林

目录 决策树是&#xff1a;Why&#xff1a;How&#xff1a;基本概念决策树生成举例决策树缺点参考 Demo 随机森林1.是&#xff1a;2.Why&#xff1a;3.How&#xff1a;参考 Demo 决策树 是&#xff1a; 1.一种有监督的分类&#xff08;或预测&#xff09;算法。 2.利用属性、…

并查集模板的应用:连通块

一、链接 837. 连通块中点的数量 二、题目 给定一个包含 nn 个点&#xff08;编号为 1∼n1∼n&#xff09;的无向图&#xff0c;初始时图中没有边。 现在要进行 mm 个操作&#xff0c;操作共有三种&#xff1a; C a b&#xff0c;在点 aa 和点 bb 之间连一条边&#xff0c…

Windows server上用nginx部署vue3项目

Windows server上用nginx部署vue3项目 一、Node中node_modules文件夹及package.json文件的作用说明二、VUE3项目打包三、Windows Server上的Nginx部署 一、Node中node_modules文件夹及package.json文件的作用说明 node_modules是安装node后用来存放用包管理工具下载安装的包的…

快速消除视频的原声的技巧分享

网络上下载的视频都会有视频原声或者背景音乐&#xff0c;如果不喜欢并且想更换新的BGM要怎么操作呢&#xff1f;今天小编就来教你如何快速给多个视频更换新的BGM&#xff0c;很简单&#xff0c;只需要将原视频的原声快速消音同时添加新的背景音频就行&#xff0c;一起来看看详…

设计模式行为型——中介者模式

目录 什么是中介者模式 中介者模式的实现 中介者模式角色 中介者模式类图 中介者模式代码实现 中介者模式的特点 优点 缺点 使用场景 注意事项 实际应用 什么是中介者模式 中介者模式&#xff08;Mediator Pattern&#xff09;属于行为型模式&#xff0c;是用来降低…

CVE漏洞复现-CVE-2019-5021 镜像漏洞利用

CVE-2019-5021 镜像漏洞利用 随着容器技术的普及&#xff0c;容器镜像也成为软件供应链中非常重要的一个组成的部分。人们像使用 pip 等工具从仓库获取各种编程软件库一样&#xff0c;可以从 Docker Hub 或 第三方仓库拉取镜像&#xff0c;在其基础上进行开发&#xff0c;从而…

网络音频终端音频编码解码终端

网络对讲终端SV-7011V 网络对讲终端SV-7011V&#xff0c;采用了ARM音频DSP架构&#xff0c;集网络对讲、网络广播、监听等功能于一身&#xff0c;内置麦克风、配置line out、line in、Mic in功能输出接口&#xff0c;适用于学校&#xff0c;机场&#xff0c;广场等场所。 产品…

保姆级教程--抢先体验 Microsoft 365 Copilot,微软全家桶Chat GPT

【ChatGPT】前些天发现了一个巨牛的人工智能学习电子书&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;无广告&#xff0c;忍不住分享一下给大家。&#xff08;点击查看学习资料&#xff09; 前段时间微软发的Microsoft 365 Copilot 可以说非常火爆了&#xff0c;那么该…

元素2D转3D 椭圆形旋转实现

椭圆旋转功能展示 transform-style: preserve-3d;&#xff08;主要css代码&#xff09; gif示例&#xff08;背景图可插入透明以此实现边框线的旋转&#xff09; 导致的无法点击遮挡问题可以参考我的另一个文章 穿透属性-----------------------css穿透属性 实时代码展示

决策树的划分依据之:信息增益率

在上面的介绍中&#xff0c;我们有意忽略了"编号"这一列.若把"编号"也作为一个候选划分属性&#xff0c;则根据信息增益公式可计算出它的信息增益为 0.9182&#xff0c;远大于其他候选划分属性。 计算每个属性的信息熵过程中,我们发现,该属性的值为0, 也就…

Redis 双写一致性实践及案例

面试问题&#xff1a; 你只要用缓存&#xff0c;就可能会涉及到redis缓存与数据库双存储双写&#xff0c;你只要是双写&#xff0c;就一定会有数据一致性的问题&#xff0c;那么你如何解决一致性问题&#xff1f;双写一致性&#xff0c;你先动缓存redis还是数据库mysql哪一个&…