Mysql篇-优化

news2025/5/24 22:20:55

Mysql篇主要是纯理论的面试问题与技巧。

主要从以下进行开展:

 索引相关问题:

1、Mysql如何定位慢查询?

Mysql慢查询:某个业务查询数据响应时间过长或者与预期响应时间相差大。

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

往往在以下查询中会出现:

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

定位方式1:使用开源工具进行定位

调试工具:

  • Arthas

运维工具:

  • Prometheus
  • Skywalking

 Skywalking工具

 Skywalking工具--追踪功能

定位方式2:MySQL自带慢日志

慢查询日志记录了所有执行时间超过指定参数(long_query time,单位:秒,默认10秒)的所有SQL语句的日志

如果要开启慢查询日志,需要在MySQL的配置文件(/etc/my.cnf)中配置如下信息:

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

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

往往在以下查询中会出现:

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

  前面三种【聚合查询、多表查询、表数据量过大查询】可以通过SQL执行计划查找查询慢的原因

 具体操作:可以采用 EXPLAIN 或者 DESC 命令获取 MySQL如何执行 SELECT 语句的信息。如

EXPLAIN 
SELECT * FROM asset_brand;

 执行计划中关键字段

  • possible key: 当前sql可能会使用到的索引
  • key: 当前sql实际命中的索引
  • key_len: 索引占用的大小
  • Extra: 额外的优化建议

  • type: 这条sql的连接的类型性能由好到差为【NULL---ALL性能依次变差
    • NULL:查询时没使用表
    • SYSTEM:查询系统中的表
    • CONST:根据主键查询
    • EQ_REF:主键索引查询或唯一索引查询
    • REF:索引查询
    • RANGE:范围查询
    • INDEX:索引树扫描【效率低】
    • ALL:全盘扫描【效率最低】

注意:当SQL的索引类型为INDEX或者ALL的时候,则说明这条SQL需要优化了。

回到问题:那这个SQL语句执行很慢,如何分析呢?

可以采用MySQL自带的分析工具 EXPLAIN

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

3、了解过索引吗?什么是索引?

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

衍生问题:索引的底层数据结构了解过嘛?

MySQL的InnoDB引擎采用的B+树的数据结构来存储索引

  • 阶数更多,路径更短
  • 磁盘读写代价B+树更低,非叶子节点只存储指针,叶子阶段存储数据
  • B+树便于扫库和区间查询,叶子节点是一个双向链表

衍生问题:为什么使用B+树而不使用别的数据结构?

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

B树与B+树对比【B+树只有在叶子节点存数据,其他节点存的是数据的指针,所以查询效率高】

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

4、什么是聚簇索引【聚集索引】与非聚簇索引【二级索引】?

聚簇索引(聚集索引):数据与索引放到一块,B+树的叶子节点保存了整行数据,有且只有一个非聚非聚簇索引(二级索引):数据与索引分开存储,B+树的叶子节点保存对应的主键,可以有多个

聚簇索引【聚集索引】选取规则::

  • 如果存在主键、主键索引就是聚集索引。
  • 如果不存在主键,将使用第一个唯一(UNIQUE)索引作为聚集索引。
  • 如果表没有主键或没合适的唯一索引,则InnoDB会自动生成一个rowid作为隐藏的聚集索引。

非聚簇索引【二级索引】:即我们自己给表中加的索引。

例如:

ALTER TABLE table_name[表名] ADD INDEX index_name[索引名称] (column_name)[表字段];


什么是回表?

通过二级索引找到对应的主键值,到聚集索引中查找整行数据,这个过程就是回表。

5、什么是覆盖索引?

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

  • 使用id查询,直接走聚集索引查询,一次索引扫描,直接返回数据,性能高。
  • 如果返回的列中没有创建索引,有可能会触发回表查询,尽量避免使用select

衍生问题:Mysql超大分页什么处理?

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

解决方案:覆盖索引+子查询

因为,当在进行分页查询时,如果执行 limit 9000000,10,此时需要MySQL排序前9000010 记录,仅仅返回9000000-9000010 的记录,其他记录丢弃,查询排序的代价非常大。

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

 6、索引的创建原则有哪些?

  • 1).数据量较大,且查询比较频繁的表【重要】
  • 2).常作为查询条件(where)、排序(order by)、分组(group by)的字段【重要】
  • 3).字段内容区分度高
  • 4).内容较长,使用前缀索引
  • 5).尽量联合索引【重要】
  • 6).要控制索引的数量【重要】
  • 7).如果索引列不能存储NULL值,请在创建表时使用NOT NULL约束它

7、什么情况下索引会失效?

查看失效的方式有:使用EXPLIAN执行计划来分析,一般有一下几种情况:

  • 违反最左前缀法则
  • 范围查询右边的列,不能使用索引
  • 不要在索引列上进行运算操作,索引将失效
  • 字符串不加单引号,造成索引失效。(类型转换)
  • 以%开头的Like模糊查询,索引失效

8、SQL优化经验

表的设计优化(参考阿里开发手册《嵩山版》)            

  • 比如设置合适的数值(tinyint、int、bigint)
  • 比如设置合适的字符串类型(char和varchar)char定长效率高,varchar可变长度效率低,text等

索引优化:参考第6点索引的创建原则

SQL语句优化

  • SELECT语句务必指明字段名称(避免直接使用select*)
  • SQL语句要避免造成索引失效的写法
  • 尽量用union all代替union union会多一次过滤,效率低
  • 避免在where子旬中对字段进行表达式操作
  • Join优化 能用innerjoin 就不用left join right join,如必须使用 一定要以小表为驱动内连接会对两个表进行优化,优先把小表放到外边,把大表放到里边。left join 或right join,不会重新调整顺序

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

分库分表 

分库分表(Database Sharding)是指将一个大的数据库拆分成多个小的数据库或数据表,以提高数据库的性能、扩展性和管理性。分库分表通常用于处理大数据量、访问量高的应用场景。决定分库分表的依据通常有以下几个方面:

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

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

相关文章

一文详解生成式 AI:李宏毅《生成式 AI 导论》学习笔记

生成式 AI 是怎么回事 人工智能(Artificial Intelligence) “智能”是一个广泛而复杂的概念,其定义和应用范围随着技术、科学和社会的发展不断演变。在当前的语境下,“智能”通常与人工智能(AI)相关联&am…

什么是物联网 (IoT):2024 年物联网概述

物联网(IoT)是一个有望彻底改变我们生活、工作以及与环境互动方式的概念。如今,越来越多的新兴企业和老牌企业都在利用物联网的力量创造创新产品与服务。正因为这一转变,互联互通已成为我们生活中不可或缺的一部分,科技…

8级-数组

前情回顾:在7级的时候,我们学习了如何定义、使用函数 目录 概念 什么是数组? 一维数组 声明 初始化 访问元素 计算数组长度 二维数组 声明 初始化 访问元素 思考 一维数组在内存中如何存储? 二维数组在内存中如何存储&…

大模型 Agent 就是文字艺术吗?

最近在技术圈里有一个很有趣的争论:大模型 Agent 是不是就是各种 Prompt 的堆叠?像 Manus 这样看起来很智能的 Agent,本质上是不是就是用巧妙的 Prompt 约束大模型生成更好的输出?换句话说,这是不是一门文字艺术&#…

YOLOv8检测头代码详解(示例展示数据变换过程)

本文旨在通过实例数据,详细解读YOLOv8检测头的网络结构及其代码实现。首先将从检测头的网络架构开始讲解,涵盖代码与网络结构图的对比分析。关键在于深入探讨检测头的输出结果,因为这些输出将直接用于损失函数的计算。由于在不同阶段&#xf…

JUC并发编程1

什么是juc 在java的java.util.concurrent包下的工具。 锁 传统的synchronize public class SealTicket {int total 50;public synchronized void seal() {if (total > 0) {System.out.println(Thread.currentThread().getName() "卖出第" (total--) "张…

STM32开发环境配置——VSCode+PlatformIO + CubeMX + FreeRTOS的集成环境配置

前言 为什么配置这样的一个环境呢?鄙人受够了Keil5那个简陋的工作环境了,实在是用不下去,调试上很容易跟CubeMX的代码产生不协调导致调试——发布代码不一致造成的一系列问题。CubeIDE虽说不错,但是它的代码辅助功能和构建系统实在…

Profibus转Profinet网关赋能鼓式硫化机:智能化生产升级的关键突破

在现代工业自动化领域,通讯协议转换器发挥着至关重要的角色。它们能够实现不同网络间的无缝对接和数据传输,确保了生产线上的设备可以顺畅地交流信息。今天,我们就来深入讨论开疆智能profibus转profinet网关KJ-PBM-PN以及其在鼓式硫化机中的应…

MongoDB 用户与权限管理完全指南

在当今数据驱动的时代,数据库安全已成为企业IT架构中最关键的环节之一。作为最受欢迎的NoSQL数据库之一,MongoDB提供了完善的用户认证和权限管理机制,但许多开发者和数据库管理员对这些功能的理解和应用仍停留在表面层次。本文将全面剖析Mong…

基于ITcpServer/IHttpServer框架的HTTP服务器

https://www.cnblogs.com/MuZhangyong/p/16839231.html 在基于ITcpServer/IHttpServer框架的HTTP服务器实现中,OnBody方法主要用于接收HTTP请求体数据,而触发HTTP响应通常是在OnMessageComplete方法中完成。以下是完整的响应触发机制说明: sequenceDiagramClient->>…

FPGA高效验证工具Solidify 8.0:全面重构图形用户界面

近日,FPGA高效验证工具Solidify发布了8.0版本。该版本对图形用户界面(GUI)进行了全面重构,历时两年,经过了大幅的架构改进,旨在为用户提供更安全、更稳定的使用环境。 Solidify的用户对隐私有严格要求&…

SIL2/PLd 认证 Inxpect毫米波安全雷达:3D 扫描 + 微小运动检测守护工业安全

Inxpect 成立于意大利,专注工业安全技术。自成立起,便致力于借助先进雷达技术提升工业自动化安全标准,解决传统安全设备在复杂环境中的局限,推出获 SIL2/PLd 和 UL 认证的安全雷达产品。 Inxpect 的雷达传感器技术优势明显。相较于…

2025电工杯数学建模A题思路数模AI提示词工程

我发布的智能体链接:数模AI扣子是新一代 AI 大模型智能体开发平台。整合了插件、长短期记忆、工作流、卡片等丰富能力,扣子能帮你低门槛、快速搭建个性化或具备商业价值的智能体,并发布到豆包、飞书等各个平台。https://www.coze.cn/search/n…

LLM | 论文精读 | NAACL 2025 | Clarify When Necessary:教语言模型何时该“问一句”再答!

🔍 解读 NAACL 2025 重磅论文《Clarify When Necessary》:教语言模型何时该“问一句”再答! 🧩 一、现实问题:大模型“看不懂装懂”有多危险? 我们每天用的 ChatGPT、Claude 等大型语言模型(LL…

嵌入式鸿蒙openharmony应用开发环境搭建与工程创建实现

各位小伙伴大家好,本周开始分享鸿蒙开发相关的内容,从基础的配置方法到各种功能的实现,探索国产操作系统的奥秘。 第一:观察结果 第二:开源语言 ArkTS是鸿蒙应用开发中使用的TypeScript超集,提供了一套丰富的API来构建应用界面和逻辑。 第三:环境搭建 步骤 1 通过如…

MDK的编译过程及文件类型全解

本章参考资料:MDK的帮助手册《ARM Development Tools》,点击MDK界面的“help->uVision Help”菜单可打开该文件。 关于ELF文件格式,参考配套资料里的《ELF文件格式》文件。 在本章中讲解了非常多的文件类型,学习时请跟着教程的…

Linux Shell编程(八)

目录 Case语句 1--case格式 2--case使用案例:输入不容的数字,给出不同的结果 跳出循环 1--break 案例:执行十次时,跳出当前循环 完整流程 2--continue 案例:跳过2,4 输出 完整流程 Case语句 1--case格式 c…

AI筑基,新质跃升|英码科技亮相华为广东新质生产力创新峰会,发布大模型一体机新品,助力产业智能化转型

5月15日,以“AI筑基,新质跃升”为主题的华为中国行2025广东新质生产力创新峰会在惠州圆满召开。本次峰会聚焦人工智能、算力基础设施等新ICT技术如何驱动“新质生产力”,共探广东高质量发展新路径。英码科技受邀出席本次峰会,并携…

手机打电话时由对方DTMF响应切换多级IVR语音菜单(话术脚本与实战)

手机打电话时由对方DTMF响应切换多级IVR语音菜单 (话术脚本与实战) --本地AI电话机器人 上一篇:手机打电话时由对方DTMF响应切换多级IVR语音应答(二) 下一篇:手机打电话时由对方DTMF响应切换多级IVR语音…

面试题——JDBC|Maven|Spring的IOC思想|DI思想|SpringMVC

目录 一、JDBC 1、jdbc连接数据库的基本步骤(掌握**) 2、Statement和PreparedStatement的区别 (掌握***) 二、Maven 1、maven的作用 2、maven 如何排除依赖 3、maven scope作用域有哪些? 三、Spring的IOC思想 …