当前位置: 首页 > article >正文

精挑20题:MySQL 8.0高频面试题深度解析——掌握核心知识点、新特性和优化技巧


1. MySQL 8.0 中,为什么查询缓存被移除?

  • 答案

    • 原因:查询缓存对频繁更新的表效果差,任何对该表的写操作都会清空所有相关缓存,导致缓存命中率低,反而增加开销。

    • 替代方案

      • 使用应用层缓存(如 Redis)。
      • 优化查询和索引,减少对缓存的依赖。
    • MySQL 8.0 改进:通过索引优化、并行查询等提升性能,弥补查询缓存缺失的影响。


2. InnoDB 的行锁和表锁分别在什么场景下使用?

  • 答案

    • 行锁:高并发场景下更新或查询单行数据(如 UPDATE users SET score=100 WHERE id=1)。
    • 表锁:低并发场景或批量操作(如 LOCK TABLES ... READ/WRITE)。
    • 锁升级:当行锁数量过多时,InnoDB 可能升级为表锁(通过 innodb_lockescalation 控制)。

3. MySQL 8.0 的窗口函数与用户自定义变量实现的滚动求和有何区别?

  • 答案

    • 窗口函数

      • 语法简洁(如 SUM(column) OVER (PARTITION BY ...)),无需复杂子查询。
      • 性能更优,基于 SQL 标准,代码可读性高。
    • 自定义变量

      • 需手动维护变量,易出错(如 @sum := @sum + column)。
      • 不支持复杂分区和排序,且在并行查询中可能失效。

4. 如何解决 UPDATE 语句执行慢的问题?

  • 答案

    • 优化点

      • 添加索引(如 WHERE 和 JOIN 条件字段)。
      • 减少更新范围(如分批次更新)。
      • 使用 LIMIT 防止全表锁。
    • 工具

      • EXPLAIN 分析执行计划。
      • pt-online-schema-change 实现在线更新。

5. MySQL 8.0 中,SHOW ENGINE INNODB STATUS 的 TRANSACTIONS 部分能提供哪些关键信息?

  • 答案

    • 事务状态:当前活跃事务、锁等待情况。
    • 死锁信息:发生死锁时的事务 ID、锁资源及 SQL 语句。
    • 事务日志:Redo Log 和 Undo Log 的状态,帮助排查事务阻塞。

6. 如何设计高可用的 MySQL 8.0 集群?

  • 答案

    • 方案

      • Group Replication:MySQL 原生的多主复制集群,支持自动故障转移。
      • ProxySQL + Keepalived:结合负载均衡和主从切换。
    • 关键配置

      • 启用 GTID(全局事务标识符)确保数据一致性。
      • 设置 super_read_only 防止从库误写。

7. 如何备份和恢复 MySQL 8.0 的数据?

  • 答案

    • 逻辑备份

      • mysqldump 全量或增量备份(结合 --single-transaction)。
    • 物理备份

      • xtrabackup 热备份(无需锁表)。
    • 恢复策略

      • 使用 binlog 进行时间点恢复(POINT_IN_TIME)。
      • 集群恢复需同步 GTID

8. MySQL 8.0 的 Caching SHA2 Password 认证插件有何优势?

  • 答案

    • 安全性:支持 SHA-256 加密,比 mysql_native_password 更安全。
    • 兼容性:需确保客户端支持(如 MySQL 8.0+ 或配置 allowPublicKeyRetrieval=true)。
    • 默认配置:MySQL 8.0 默认启用,可通过 ALTER USER 改回旧插件。

9. 如何优化大表的 DELETE 操作?

  • 答案

    • 分批删除

      DELETE FROM table WHERE id BETWEEN 1 AND 10000; -- 循环分批  
      
    • 索引优化:在 WHERE 条件字段上建立索引。

    • 锁控制:使用 ROW_COUNT 或 LIMIT 避免长时间锁表。


10. MySQL 的 EXPLAIN 中 type=range 和 type=index 有何区别?

  • 答案

    • range:基于范围的索引扫描(如 WHERE id > 100)。
    • index:全索引扫描(未命中条件,需回表查询)。
    • 优化建议:确保查询条件能命中索引范围。

11. 如何实现 MySQL 的读写分离?

  • 答案

    • 方案

      • ProxySQL:动态路由读写请求。
      • MySQL Router:结合 Group Replication 的只读节点。
    • 注意事项

      • 主从延迟可能导致读到旧数据。
      • 使用 READ_ONLY 模式强制从库只读。

12. MySQL 的 JSON_TABLE 函数如何将 JSON 转换为关系表?

  • 答案

    SELECT * FROM JSON_TABLE('[{"name": "Alice", "age": 30}, {"name": "Bob", "age": 25}]','$[*]' COLUMNS(name VARCHAR(20) PATH '$.name',age INT PATH '$.age')
    ) AS jt;
    
    • 作用:将 JSON 数组转换为行和列,便于 SQL 查询。

13. 如何解决 SELECT FOR UPDATE 的死锁问题?

  • 答案

    • 策略

      • 按固定顺序加锁(如先锁主键,再锁外键)。
      • 减少事务持有锁的时间。
    • 检测与处理

      • 使用 SHOW ENGINE INNODB STATUS 定位死锁。
      • 设置 innodb_lock_wait_timeout 自动回滚。

14. MySQL 的 PARTITION 如何优化大表查询?

  • 答案

    • 分区策略:按范围(RANGE)、哈希(HASH)或列表(LIST)分区。

    • 优势

      • 减少扫描数据量(如 WHERE year=2023 直接定位分区)。
      • 分区独立维护(如单独备份或删除旧分区)。
    • 注意:分区键需与查询条件匹配。


15. 如何监控 MySQL 的慢查询?

  • 答案

    • 配置

      slow_query_log = ON  
      long_query_time = 1  
      log_output = FILE  
      
    • 分析工具

      • mysqldumpslow 统计慢查询。
      • pt-query-digest 可视化分析。

16. MySQL 的 TRUNCATE 和 DELETE 的区别是什么?

  • 答案

    • TRUNCATE

      • 重置表结构,速度快,不记录行级日志。
      • 无法回滚,不触发触发器。
    • DELETE

      • 行级删除,可回滚,记录日志。
      • 需要满足 WHERE 条件。

17. 如何实现 MySQL 的跨库分页查询?

  • 答案

    • 优化方法

      • 覆盖索引:确保查询字段在索引中(避免回表)。
      • 分页优化:使用 WHERE id > last_id LIMIT 10 替代 LIMIT 1000000
    • 工具

      • SQL_CALC_FOUND_ROWS 统计总行数(需谨慎使用)。

18. MySQL 的 FUNCTIONAL 索引如何加速 JSON 查询?

  • 答案

    CREATE INDEX idx_json ON table (JSON_EXTRACT(json_col, '$.name'));
    
    • 作用:将 JSON 路径值存储为索引,加速 WHERE json_col->>'$.name' = 'Alice' 的查询。

19. 如何设计高并发场景下的计数器?

  • 答案

    • 方案

      • 使用 AUTO_INCREMENT 主键自增。
      • 分布式场景用 Redis 缓存计数,定期同步到 MySQL。
    • 避免锁竞争

      • 减少事务粒度,使用 NOWAIT 或 SKIP LOCKED

20. MySQL 8.0 的 GROUPING SETS 如何实现多维聚合?

  • 答案

    SELECT category, SUM(sales), GROUPING(category) 
    FROM sales 
    GROUP BY GROUPING SETS ( (category), () );
    
    • 作用:生成多个分组结果(如按 category 和总和同时返回)。

总结:高频考点与技巧

  • 核心知识点:锁机制、事务隔离、分区表、JSON 函数、高可用架构。
  • 优化方向:索引设计、慢查询分析、分布式事务、集群配置。
  • 陷阱规避:避免全表锁、合理使用 GROUP BY、注意 VARCHAR 的存储开销。

借助DBLens for MySQL数据库工具,文章涉及的SQL语句得以高效执行与管理。

相关文章:

精挑20题:MySQL 8.0高频面试题深度解析——掌握核心知识点、新特性和优化技巧

1. MySQL 8.0 中,为什么查询缓存被移除? 答案: 原因:查询缓存对频繁更新的表效果差,任何对该表的写操作都会清空所有相关缓存,导致缓存命中率低,反而增加开销。 替代方案: 使用应用…...

调研报告:Hadoop 3.x Ozone 全景解析

Ozone 是 Hadoop 的分布式对象存储系统,具有易扩展和冗余存储的特点。 Ozone 不仅能存储数十亿个不同大小的对象,还支持在容器化环境(比如 Kubernetes)中运行。 Apache Spark、Hive 和 YARN 等应用无需任何修改即可使用 Ozone。Ozone 提供了 Java API、S3 接口和命令行接口…...

深入理解 RLP 编码与 JSON:原理、应用与比较

在区块链和数据存储领域,RLP(Recursive Length Prefix)编码和**JSON(JavaScript Object Notation)**是两种重要的数据编码方式。它们分别适用于不同的应用场景,并具有不同的优缺点。本文将系统性地分析 RLP…...

【Linux】Makefile秘籍

> 🍃 本系列为Linux的内容,如果感兴趣,欢迎订阅🚩 > 🎊个人主页:【小编的个人主页】 >小编将在这里分享学习Linux的心路历程✨和知识分享🔍 >如果本篇文章有问题,还请多多包涵&a…...

玩转物联网-4G模块如何快速将数据上传到巴法云(TCP篇)

目录 1 前言 2 环境搭建 2.1 硬件准备 2.2 软件准备 2.3 硬件连接 2.4 检查驱动 3 巴法云平台设备创建 3.1 创建账号 3.2 进入巴法云 3.3 获取联网参数 4 连接巴法云 4.1 打开配置工具读取基本信息 4.2 设置连接参数进行数据交互 4.2.1 建立TCP连接 4.2.2 订阅主题 4.2.3 发布信…...

postgresql 高版本pgsql备份在低版本pgsql中恢复失败,报错:“unsupported version”

关键字 PostgreSQL、pg_restore、版本兼容性、数据库迁移、pg_dump、备份恢复、unsupported version in file header 背景环境 系统配置 环境类型操作系统PostgreSQL版本内存工具链测试环境Windows 111616GBNavicat/PgAdmin生产环境Windows Server 2012 R2128GBPgAdmin/命令…...

html相关常用语法

html相关常用语法 HTML(HyperText Markup Language)即超文本标记语言,是用于创建网页的标准标记语言 HTML使用标记语言描述Web页面的结构 HTML元素是HTML页面的建构快 HTML元素通过标签tag来表示 HTML标签是“标题”、”段落“、”表格“等内…...

vue3+ts心得

1、Vue3核心 1、setup setup里弱化this,return可以返回函数,返回后页面也显示那个函数值 data里面是可以用this.来获取setup里的值,这个是单向的 vue3两个script标签不要觉得奇怪,一个是配置组合式api的,一个是配置组…...

单片机flash存储也做磨损均衡

最近在做一个项目,需要保存设置数据,掉电不丢失。那么首先想到的是加个24c02,是一个eeprom,但是客户板太小,没有办法进行扩展。后面就找了一个带ee的OTP单片机,发现擦写次数有限,只有1000次&…...

【FAQ】HarmonyOS SDK 闭源开放能力 —Push Kit(10)

1.问题描述: 离线推送,锁屏的时候没有弹出消息,只有下拉在通知中心里面显示。请问是否是正常的? 解决方案: 检查一下是否存在图片风控:https://developer.huawei.com/consumer/cn/doc/harmonyos-referen…...

SQLark中如何进行数据筛选与排序

本文将为你介绍在 SQLark 中如何进行数据筛选与排序,掌握这些操作能够极大提升你的工作效率。 SQLark官网链接:www.sqlark.com 数据筛选 在数据库操作中,数据筛选是一项关键功能,它依据特定条件对数据进行过滤,帮助用户从海量数据…...

token升级(考虑在分布式环境中布置token,结合session保证请求调用过程中token不会过期。)

思路: 首先,用户的需求是确保使用同一个Token的外部调用都在一个Session中处理。 需要考虑Token与Session绑定、安全措施、Session管理、分布式处理等。 使用Redis作为Session存储, 在Java中 通过Spring Data Redis或Lettuce库实现。 2.生成…...

VSTO(C#)Excel开发11:自定义任务窗格与多个工作簿

初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github:codetoys,所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的,可以在任何平台上使用。 源码指引:github源…...

python:AI+ music21 构建LSTM模型生成爵士风格音乐

这是一个使用 python的 music21 和 TensorFlow/Keras 构建 LSTM 模型生成爵士风格音乐的完整脚本。该脚本包含MIDI数据处理、模型训练和音乐生成全流程: # -*- coding: utf-8 -*- """AI music21 和 TensorFlow/Keras 构建LSTM模型生成爵士风格音乐 …...

vscode查看文件历史git commit记录

方案一:GitLens 在vscode扩展商店下载GitLens 选中要查看的文件,vscode界面右上角点击GitLens的图标,选择Toggle File Blame 界面显示当前打开文件的所有修改历史记录 鼠标放到某条记录上,可以看到记录详情,选中O…...

使用netDxf扩充LaserGRBL使它支持Dxf文件格式

为 LaserGRBL 扩展支持 DXF 文件格式,需要了解 LaserGRBL 的代码结构,并在其基础上添加 DXF 文件的解析和转换逻辑。以下是详细的扩展方案: 1. 了解 LaserGRBL LaserGRBL 是一个用于控制激光雕刻机的开源软件,支持 G 代码文件的加…...

GaussDB备份数据常用命令

1、常用备份命令gs_dump 说明:是一个服务器端工具,可以在线导出数据库的数据,这些数据包含整个数据库或数据库中指定的对象(如:模式,表,视图等),并且支持导出完整一致的数…...

数学建模 第三节

目录 前言 一 钻井布局问题 第一问分析 第二问分析 总结 前言 这里讲述99年的钻井布局问题,利用这个问题讲述模型优化,LINGO,MATLAB的使用 一 钻井布局问题 这个是钻井布局的原题,坐标的位置为 a [0.50,1.41,3.00,3.37,3…...

单调队列【C/C++】

当我在网上搜索了一大堆单调队列的文章后, 我人傻了!? 单调队列不应该很难吗?? 不应该是,像 优先队列 那样,站在 堆 的肩膀上,极尽升华吗??? …...

Spark DataFrame、Dataset 和 SQL 解析原理深入解析(万字长文多张原理图)

目录 1. Spark SQL 概述 1.1 Spark 整体架构概览 1.2 DataFrame 与 Dataset 简介 2. RDD 与 Spark 的分布式架构基础 2.1 弹性分布式数据集(RDD) 2.2 Spark 的分布式执行模型 3. SQL 解析流程与 Catalyst 优化器 3.1 SQL 解析流程概述 3.2 解析阶段与抽象语法树(AST…...

算法系列——有监督学习——3.逻辑回归

一、概述 逻辑回归是一种学习某个事件发生概率的算法。利用这个概率,可以对某个事件发生或不发生进行二元分类。虽然逻辑回归本来是二元分类的算法,但也可以用于三种类别以上的分类问题。为了理解这个算法,请思考以下例子。 你在回家的路上发…...

深入理解traceroute命令及其原理

traceroute 是一个网络诊断工具(Windows上叫tracert),用于显示数据包从本地主机到远程主机经过的路由(跳数)。它可以帮助您了解数据包在网络中的传输路径,以及每跳的延迟情况。这对于网络故障排除、分析网络…...

前后端联调解决跨域问题的方案

引言 在前后端分离的开发模式中,前端和后端通常在不同的服务器或端口运行,这样就会面临跨域问题。跨域问题是指浏览器因安全限制阻止前端代码访问与当前网页源不同的域、协议或端口的资源。对于 Java 后端应用,我们可以通过配置 CORS&#x…...

深入解析 .NET 中的依赖项加载机制:原理、实现与最佳实践

在现代应用程序的开发中,依赖项管理与加载是非常重要的组成部分,尤其是在大型系统中,如何高效地加载和管理依赖项可以极大地影响应用程序的性能、可维护性和扩展性。在 .NET 中,依赖项加载不仅涉及静态依赖的管理,还包…...

【vue2 + Cesium】相机视角移动+添加模型、模型点击事件

参考文章:vue2 使用 cesium 【第二篇-相机视角移动添加模型】 这篇文章在上篇文章的基础上继续开发,主要实现效果 相机视角移动 添加模型 点击事件 上篇文章:【vue2 Cesium】使用Cesium、添加第三方地图、去掉商标、Cesium基础配置、地…...

【AI】AI编程助手:Cursor、Codeium、GitHub Copilot、Roo Cline、Tabnine

文章目录 一、基本特性对比二、收费标准三、私有部署能力1、Tabnine2、Roo Code 三、代码补全与自然语言生成代码四、安装独立的IDE安装插件安装 五、基本使用(一)Cursor(二)GitHub Copilot1、获取代码建议2.聊天1)上下…...

我的uniapp自定义模板

uniapp自定义模板 如有纰漏请谅解,以官方文档为准后面这段时间我会学习小程序开发的知识,会持续更新可以查看我的github,后续我会上传我的uniapp相关练习代码有兴趣的话可以浏览我的个人网站,我会在上面持续更新内容,…...

如何将MediaPipe编译成Android中Chaquopy插件可用的 .whl 文件

环境准备 操作系统:建议使用 Ubuntu 20.04 或者 macOS(这篇博客会以 Ubuntu 为例)。Python 版本:Python 3.7 或以上版本。Android Studio:配置好 Android Studio 和 Android NDK(Native Development Kit&a…...

华为OD机试-绘图机器-双指针(Java 2025 A卷 100分)

题目描述 绘图机器的绘图笔初始位置在原点 (0, 0)。机器启动后按照以下规则绘制直线: 尝试沿着横坐标正向绘制直线,直到给定的终点 E。期间可以通过指令在纵坐标轴方向进行偏移,offsetY 为正数表示正向偏移,为负数表示负向偏移。给定的横坐标终点值 E 以及若干条绘制指令,…...

【C++】动态规划从入门到精通

一、动态规划基础概念详解 什么是动态规划 动态规划(Dynamic Programming,DP)是一种通过将复杂问题分解为重叠子问题,并存储子问题解以避免重复计算的优化算法。它适用于具有以下两个关键性质的问题: 最优子结构&…...