黑马Java面试笔记之MySQL篇(优化)

article/2025/8/5 15:39:59

 一. 慢查询

在MySQL中,如何定位慢查询?

 出现慢查询的情况有以下几种:

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

表象:页面加载过慢,接口压测响应时间过长(超过1s)

1.2 如何定位慢查询?

方案一:开源工具

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

方案二:MySQL自带慢日志

        慢查询日志记录了所有执行时间超过指定参数(long_query_time,单位:秒,默认10秒)的所有SQL语句的日志,如果要开启慢查询日志,需要在MySQL的配置文件(/etc/my.cnf)中配置如下信息:

        配置完毕之后,通过一下指令重新启动MySQL服务器进行测试,查看慢日志文件中记录的信息 /var/lib/mysql/localhost-slow.log。

总结

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

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

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


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

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

2.1 分析

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

总结

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

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


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

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

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

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

3.1 数据结构对比

        MySQL默认使用的索引底层数据结构是B+树。再聊B+树之前,先聊聊二叉树和B树

        B-Tree,B树是一种多叉路衡查找树,相对于二叉树,B树每个节点可以有多个分支,即多叉。以一颗最大度数(max-degree)为5(5阶)的b-tree为例,那这个B树每个节点最多存储4个key

          B+Tree是在BTree基础上的一种优化,使其更适合实现外存储索引结构,InnoDB存储引擎就是用B+Tree实现其索引结构

总结

四. 聚簇索引和非聚簇索引

什么是 聚簇索引和非聚簇索引?

什么是聚集索引,什么是二级索引(非聚集索引)

什么是回表

4.1 聚集索引,二级索引(非聚集索引)

4.2 回表查询

总结

注意:如果面试官直接问什么是回表查询,要先解释一下聚集索引和二级索引


五. 覆盖索引

5.1 覆盖索引

        查询使用了索引,并且需要返回的列,在该索引中已经全部能够找到。

 

5.2 MYSQL超大分页处理

        在数据量比较大时,如果进行limit分页查询,在查询时,越往后,分页查询效率越低。

        优化思路:一般分页查询时,通过创建覆盖索引 能够比较好的提高性能,可以通过覆盖索引子查询形式进行优化

总结


六. 索引创建原则

索引创建原则有哪些?

        回答这个问题,首先要陈述一下自己在实际的工作中是怎么用的,比如用到了主键索引、唯一索引或者是根据业务创建的索引(复合索引)

  1. 针对于数据量较大,且查询比较频繁的表建立索引。        单表超过10万数据(增加用户体验)
  2. 针对于常作为查询条件(where)、排序(order by)、分组(group by)操作的字段建立索引。
  3. 尽量选择区分度高的列作为索引,尽量建立唯一索引,区分度越高,使用索引的效率越高。
  4. 如果是字符串类型的字段,字段的长度较长,可以针对于字段的特点,建立前缀索引。
  5. 尽量使用联合索引,减少单列索引,查询时,联合索引很多时候可以覆盖索引,节省存储时间,避免回表,提高查询效率
  6. 要控制索引的数量,所以并不是多多益善,索引越多,维护索引结构的代价也就越大,会影响增删改的效率
  7. 如果索引不能存储NULL值,请在创建表时使用NOT NULL约束它。当优化器知道每列是否包含NULL值时,它可以更好的确定哪个索引最有效的用于查询

总结

七. 索引失效

在什么情况下,索引会失效?

        索引失效的情况有很多,可以说一些自己遇到过的,不要张口就说一推背诵好的面试题(适当的思考一下,更真实)

1)违反最左前缀法则

 

         违反最左前缀法则,索引失效:

2)范围查询右边的列,不能使用索引。

3)不要咋索引列上进行运算操作,索引将失效

4)字符串不加单引号,造成索引失效。

 5)以%开头的Like模糊查询,索引失效。如果仅仅是尾部模糊匹配,索引不会失效。如果是头部模糊匹配,索引失效

 

总结

 

八. 谈一谈对sql优化的经验

 谈一谈对sql优化的经验

8.1 表的设计优化

        参考阿里开发手册《嵩山版》

8.2 索引优化

8.3 SQL语句优化

8.4 主从复制、读写分离

        如果数据库的使用场景读的操作比较多的时候,为了避免写的操作所造成的性能影响,可以采用读写分离的架构。读写分离解决的是,数据库的写入,影响了查询的效率。

总结


http://www.hkcw.cn/article/SBlHfkDeqr.shtml

相关文章

批量导出CAD属性块信息生成到excel——CAD C#二次开发(插件实现)

本插件可实现批量导出文件夹内大量dwg文件的指定块名的属性信息到excel,效果如下: 插件界面: dll插件如下: 使用方法: 1、获取此dll插件。 2、cad命令行输入netload ,加载此dll(要求AutoCAD&…

Chrome 通过FTP,HTTP 调用 Everything 浏览和搜索本地文件系统

【提问1】 Chrome调用本地 everything.exe, everything 好像有本地 FTP 服务器? 【DeepSeek R1 回答】 是的,Everything 确实内置了 HTTP/FTP 服务器功能,这提供了一种相对安全的浏览器与本地应用交互的方式。以下是完整的实现方案&#x…

《汇编语言》第13章 int指令

中断信息可以来自 CPU 的内部和外部,当 CPU 的内部有需要处理的事情发生的时候,将产生需要马上处理的中断信息,引发中断过程。在第12章中,我们讲解了中断过程和两种内中断的处理。 这一章中,我们讲解另一种重要的内中断…

CFTel:一种基于云雾自动化的鲁棒且可扩展的远程机器人架构

中文标题: CFTel:一种基于云雾自动化的鲁棒且可扩展的远程机器人架构 英文标题: CFTel: A Practical Architecture for Robust and Scalable Telerobotics with Cloud-Fog Automation 作者信息 Thien Tran, Jonathan Kua, Minh Tran, Hongh…

Spring Boot是什么?

Spring Boot是什么? Spring Boot是什么?1. 引言1.1 什么是Spring Boot?1.2 为什么选择Spring Boot? 2. Spring Boot的起源2.1 Spring框架的历史2.2 Spring Boot的诞生背景 3. Spring Boot的核心特性3.1 快速启动和部署3.2 自动配置…

基于大数据爬虫+Python+数据可视化大屏的慧游数据爬虫与推荐分析系统(源码+论文+PPT+部署文档教程等)

博主介绍:CSDN毕设辅导第一人、全网粉丝50W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行前辈交流✌ 技术范围:SpringB…

实时响应的秘密:用Spring Boot轻松实现流式AI输出

1、背景 随着AI的快速发展,越来越多的AI应用诞生了,但是AI也有响应慢的问题,一般不能够即时响应,为了优化用户体验,现在大部分AI应用都是实现了打字机的效果,那么这种效果是如何实现的呢?今天我…

Spring Boot 中 RabbitMQ 的使用

目录 引入依赖 添加配置 Simple(简单模式) 生产者代码 消费者代码 ​编辑 Work Queue(工作队列) 生产者代码 消费者代码 Publish/Subscribe(发布/订阅) 生产者代码 消费者代码 Routing&#x…

如何下载MySQL和如何下载MySQL的JDBC驱动包

1.打开MySql 官网 https://www.mysql.com/ 2.点击 DOWNLOADS 和 MySQL Community (GPL) Downloads(MySQL Community (GPL) Downloads需要滚到最下面) 截屏2022-12-12 14.23.18.png 下载MySQL和下载MySQL的JDBC驱动包前两步是一样的 下载MySQL 3.点击 MyS…

【复杂网络演化博弈_01】理论部分+代码应用

复杂网络演化博弈 一、理论部分(1)研究背景(2)群体合作困境(3)核心要素(4)网络模型1、规则网络2、随机网络3、小世界网络4、无标度网络 二、网络博弈的进展(1&#xff09…

MySQL的备份及还原

备份类型 热备份、温备份、冷备份 (根据服务器状态) 热备份:读、写不受影响; 温备份:仅可以执行读操作; 冷备份:离线备份;读、写操作均中止; 物理备份与逻辑…

【爬虫学习】动态网页数据抓取实战:Ajax逆向与浏览器自动化

【爬虫学习】动态网页数据抓取实战:Ajax逆向与浏览器自动化 摘要 针对现代网站的动态化趋势,本文深入解析Ajax接口逆向与浏览器自动化技术。通过微博热搜实时数据抓取、知乎无限滚动内容采集等实战案例,演示如何突破动态渲染壁垒&#xff0c…

【Spring Cloud Alibaba】:Nacos 使用全详解

目录 一、服务注册发现1、nacos-provider服务提供者创建2、nacos-consumer服务消费者创建 二、配置管理1、添加配置文件2、拉取配置3、读取配置4、配置热更新方式一:添加 RefreshScope 注解方式二:使用ConfigurationProperties注解代替Value注解。 5、多…

【金仓数据库征文】学校AI数字人:从Sql Server到KingbaseES的数据库转型之路

摘要:本文围绕学校 AI 数字人项目从 Sql Server 数据库替换至 KingbaseES 数据库的实践展开,涵盖迁移背景、两种数据库对比、替换实施步骤、应用效果展示、问题与解决措施等多方面内容,为教育领域类似项目提供了详实参考。 目录 1.背景与需求…

前端框架大对决:uni-app、taro、flutter、RN 哪家强?

文章目录 一、引言二、框架初印象三、开发语言与环境搭建3.1 开发语言特色3.2 环境搭建流程四、跨平台能力4.1 适配平台情况4.2 平台专有功能调用与界面适配特点五、性能表现5.1 渲染机制剖析5.2 性能测试数据六、组件与插件生态6.1 内置组件丰富度6.2 插件市场活跃度七、开发体…

rpcsx-ui-android:打造 RPCSX 模拟器原生态 Android UI

rpcsx-ui-android:打造 RPCSX 模拟器原生态 Android UI rpcsx-ui-android 项目地址: https://gitcode.com/gh_mirrors/rp/rpcsx-ui-android 项目介绍 rpcsx-ui-android 是一款为 RPCSX 模拟器量身定制的原生 Android 用户界面。该项目的目标是为用户提供流…

Android 15强制edge-to-edge全面屏体验

一、背景 Edge-to-edge 全面屏体验并非 Android 15 才有的新功能,早在 Android 15 之前系统就已支持。然而,该功能推出多年来,众多应用程序依旧未针对全面屏体验进行适配。因此,在 Android 15 的更新中,Google 终于决…

MacOS上如何运行内网穿透详细教程

本文以市面常见、好用的内网穿透为例,一款为开源内网穿透工具Frp;另一款为国产新锐软件ZeroNews。 一、Frp(开源工作、使用自由) 1. 下载 FRP 访问 FRP 的 GitHub 发布页: https://github.com/fatedier/frp/releases 选择适合 …

250207-MacOS修改Ollama模型下载及运行的路径

在 macOS 上,Ollama 默认将模型存储在 ~/.ollama/models 目录。如果您希望更改模型的存储路径,可以通过设置环境变量 OLLAMA_MODELS 来实现。具体步骤如下: 选择新的模型存储目录:首先,确定您希望存储模型的目标目录路…

iOS uni-app 原生插件开发

下面以创建一个物体检测插件为例。 开发环境: XCode 16.3 SDK包 ,4.45 HBuilderX 4.45 1. 解压 SDK 2. 创建一个插件,放到 HBuilder-uniPluginDemo 目录下 3. 配置依赖 打开 HBuilder-uniPlugin.xcodeproj 将 ObjectDetector.xcodeproj 拖…