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

news2024/11/16 3:21:57

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.coloradmin.cn/o/839287.html

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

相关文章

【关于反馈电路的放电问题】2022-1-16

缘由关于反馈电路的放电问题 - 电源技术论坛 - 电子技术论坛 - 广受欢迎的专业电子论坛!图中的副绕组反馈给三极管基极,一般都是说通过三极管充电正反馈三极管导通,放电时负反馈三极管截止,负反馈时,电容C3是通过哪个回路放电的呢…

基于Open3D的点云处理15-特征点

Intrinsic shape signatures (ISS) 参考 ISS关键点: 基本原理是避免在沿主要方向表现出类似分布的点上检测关键点,在这些点上无法建立可重复的规范参考框架,因此后续描述阶段很难变得有效。在剩余点中,显着性由最小特征值的大小决定,以便仅包…

2685. 统计完全连通分量的数量;2718. 查询后矩阵的和;1600. 王位继承顺序

2685. 统计完全连通分量的数量 核心思想:枚举所有的连通分量,然后判断这些连通分量是不是完全连通分量,完全连通分量满足边数2e 点数v(v-1)。 2718. 查询后矩阵的和 核心思想:后面的改变更重要,所以我们直接逆向思维…

无脑入门pytorch系列(二)—— torch.mean

本系列教程适用于没有任何pytorch的同学(简单的python语法还是要的),从代码的表层出发挖掘代码的深层含义,理解具体的意思和内涵。pytorch的很多函数看着非常简单,但是其中包含了很多内容,不了解其中的意思…

Spring源码——初识Spring容器

Spring源码之工厂(容器) 为什么把Spring的工厂又叫做容器呢? 工厂的责任是创建对象,但是创建完对象后还要进行存储(针对于单例的对象来讲),以供其他地方使用,这就是容器。为了能存…

STL学习

STL 泛化编程template函数模板类模板 iterator迭代器C array(STL array)容器 STL中文名为标准库,是C标准的规定并且提供了自己编写STL的接口,在编译器实现中统一的分成立几个容器头文件和几个其他的头文件来完成数据结构和算法的抽象,现在编译器使用的是…

FDM3D打印系列——超可动可变形机体打印

大家好,我是阿赵。继续来分享一下3D打印的成果。   这次打印的对象不得了,是超时空要塞系列的可变形VF战机。打印完这个模型,绝对是学习到了很多的东西,下面给大家分享一下。 一、成果展示: 不要怀疑,不…

《GPU并行计算与CUDA编程》笔记

第一个GPU程序 #include <stdio.h>__global__ void square(float* d_out,float* d_in){int idx threadIdx.x;float f d_in[idx];d_out[idx] f * f; }int main(int argc,char** argv){const int ARRAY_SIZE 8;const int ARRAY_BYTES ARRAY_SIZE * sizeof(float);// …

在linux调试进程PID的方法

当我们谈论调试 PID&#xff08;进程标识符&#xff09;时&#xff0c;我们通常是指诊断和解决与操作系统中的特定进程相关的问题。有许多工具和方法可用于调试 PID&#xff0c;以下是一些常见的方法&#xff1a; 1. 使用ps命令 ps命令是最基本的调试工具&#xff0c;用于查看…

python数据处理程序代码,如何用python处理数据

大家好&#xff0c;给大家分享一下python数据处理程序代码&#xff0c;很多人还不知道这一点。下面详细解释一下。现在让我们来看看&#xff01; 要求&#xff1a;分别以james&#xff0c;julie&#xff0c;mikey&#xff0c;sarah四个学生的名字建立文本文件&#xff0c;分别存…

Win32 EditControl多行文本框自动换行,并在添加新行时自动将光标移到末尾

【文本框属性设置】 设为多行文本框&#xff1a;MultilineTrue 允许按回车键换行&#xff1a;Want ReturnTrue 自动换行&#xff1a;Auto HScrollFalse 在最后一行按回车键&#xff0c;自动向上滚动&#xff1a;Auto VScrollTrue 显示垂直滚动条&#xff1a;Vertical ScrollTru…

Cocos Creator的rigidBody.applyForce变成了滚动

序: 1、原因是因为没有调整摩擦系数physics-material 2、摩擦系数调整你要在你的节点 一个物理材料才会有的&#xff0c;教程没跳过去了所以没有 3、扩展阅读第一话&#xff1a;入行程序员的一波三折 最终效果&#xff1a; git录屏会卡&#xff0c;其实过程很平滑 正…

PostgreSQL和MySQL多维度对比

文章目录 0.前言1. 基础对比2.PostgreSQL和MySQL语法对比3. 特性4. 参考文档 0.前言 在当今的软件开发和数据管理领域&#xff0c;数据库是至关重要的基础设施之一。选择正确的数据库管理系统&#xff08;DBMS&#xff09;对于应用程序的性能、可扩展性和数据完整性至关重要。…

无涯教程-Perl - do...while 语句函数

与 for 和 while 循环不同&#xff0c;它在循环的顶部测试循环条件&#xff0c;而 do ... while 循环在以下位置检查其条件:循环的底部。 do ... while 循环与while循环相似&#xff0c;除了保证do ... while循环至少执行一次。 do...while - 语法 do {statement(s); }while(…

PintOS lab1 threads 实验记录

Background 首先完成这个实验我们需要理清线程怎么启动的和切换的 下面这张图可以大体表示线程状态的切换 让我们看看thread init的前世今生吧&#xff08;: 从start.S汇编调用了一个c函数 pintos_init初始化了一堆东西&#xff0c;当然里面也包括了thread啦 int pintos_in…

计算机网络(5) --- http协议

计算机网络&#xff08;4&#xff09; --- 协议定制_哈里沃克的博客-CSDN博客协议定制https://blog.csdn.net/m0_63488627/article/details/132070683?spm1001.2014.3001.5501 目录 1.http协议介绍 1.协议的延申 2.http协议介绍 3.URL 4.urlencode和urldecode 2.HTTP协…

langchain-ChatGLM源码阅读:参数设置

文章目录 上下文关联对话轮数向量匹配 top k控制生成质量的参数参数设置心得 上下文关联 上下文关联相关参数&#xff1a; 知识相关度阈值score_threshold内容条数k是否启用上下文关联chunk_conent上下文最大长度chunk_size 其主要作用是在所在文档中扩展与当前query相似度较高…

HCIP MPLS综合实验

目录 题目 实验步骤 第一步、IP地址规划 第二步、配置接口IP地址 第三步、IGP配置OSPF 第五步、公网配置MPLS 第五步、使用MPLS-VPN 第六步、R2-R4使用BGP建邻并实现VPN建邻 第六步、配置B静态路由 第七步、配置B动态路由 第八步、重发布 第九步、测试 题目 1、R1…

GO语言的垃圾回收机制

内存垃圾的产生 程序在内存上被分为堆区、栈区、全局数据区、代码段、数据区五个部分。对于C等早期编程语言栈上的内存回由编译器负责管理回收&#xff0c;而堆上的内存空间需要编程人员负责申请和释放。在Go中栈上内存仍由编译器负责管理回收&#xff0c;而堆上的内存由编译器…

王道计网 第四章笔记

4.1 生活在网络层的“工人”是路由器,他负责各种异构网络的连接,但是因为他只生活在前三层所以从网络层之上的东西他不能管理,所以网路层之上的数据对于路由器来说必须是相同的、透明的。 常见的网络层协议有IP 和 ICMPTCP IP传输层协议FTP应用层协议一句话区分IP和MAC地址…