欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 健康 > 养生 > Mysql高频面试题

Mysql高频面试题

2025/2/5 19:37:43 来源:https://blog.csdn.net/xiugtt6141121/article/details/144180654  浏览:    关键词:Mysql高频面试题

Mysql高频面试题

一. sql如何定位查询慢

定义sql查询慢可以哈斯用相关的运维工具或者mysql自身提供的慢日志查询功能来实现 , 在我的项目当中也是采用了Skywalking链路追踪的中间件用来监控接口执行情况 , 在Skywalking中可以我们可以针对运行速度慢的接口进行查询 , 在其提供的可视化界面中能够清楚的展示各个链路执行的时长 , 从而定位是否为sql查询慢

除此之外也可以通过mysql的慢日志查询 , 设置超时时长 , 一单sql执行时长超过该阈值 , 就会记录该sql的全部信息

=============================================================

**面试官:**MySQL中,如何定位慢查询?

候选人:

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

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

二. 如何优化sql

我们是使用mysql的explain命令 , 该命令会显示所执行sql的执行情况

可以通过其中的key与key_len字段来判断是否命中了索引 , 从而确定是否为没穿建索引或者索引失效

也可以通过type字段 , 该字段会展示此sql语句是否有优化空间 , 我们可以通过对应的信息进行优化

除此之外还可以通过extra可以查询是否出现了回表的现象

=============================================================

**面试官:**那这个SQL语句执行很慢, 如何分析呢?

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

三. 索引

1. 什么是索引

索引是一种数据结构 , 他通过特定的算法实现查询的优化 , 能够提高数据查询的效率. 同时索引也对数据进行了排序 , 能够避免排序所要消耗的数据库资源

2. Mysql中索引是如何实现的

Mysql的默认存储引擎MongoDB所采用的索引是B+树

  1. 层级少 , 查询路径短 , 查询效率高
  2. 只有叶子结点保存数据 , 能够避免查询过程中对非叶子节点数据加载所浪费的资源
  3. 叶子节点之间通过双向链表的方式链接 , 避免范围查询重复的从根节点搜索

=============================================================

**面试官:**了解过索引吗?(什么是索引)

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

**面试官:**索引的底层数据结构了解过嘛 ?

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

**面试官:**B树和B+树的区别是什么呢?

候选人:第一:在B树中,非叶子节点和叶子节点都会存放数据,而B+树的所有的数据都会出现在叶子节点,在查询的时候,B+树查找效率更加稳定

第二:在进行范围查询的时候,B+树效率更高,因为B+树都在叶子节点存储,并且叶子节点是一个双向链表

四. 聚集索引

聚集索引一般指的是主键索引 , 主键索引的叶子节点保存的整条数据 , 而对于非聚集索引其叶子结点保存的主键ID

五. 回表查询

介绍回表查询之前需要介绍聚集索引的概念

在查询过程中先通过二级索引查询获得主键ID , 再通过主键索引查询整条数据

**面试官:**什么是聚簇索引什么是非聚簇索引 ?

候选人:

好的~,聚簇索引主要是指数据与索引放到一块,B+树的叶子节点保存了整行数据,有且只有一个,一般情况下主键在作为聚簇索引的

非聚簇索引值的是数据与索引分开存储,B+树的叶子节点保存对应的主键,可以有多个,一般我们自己定义的索引都是非聚簇索引

**面试官:**知道什么是回表查询嘛 ?

**候选人:**嗯,其实跟刚才介绍的聚簇索引和非聚簇索引是有关系的,回表的意思就是通过二级索引找到对应的主键值,然后再通过主键值找到聚集索引中所对应的整行数据,这个过程就是回表

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

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com