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

news/2025/3/28 8:38:56/

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语句得以高效执行与管理。


http://www.ppmy.cn/news/1580859.html

相关文章

基于FPGA的DDS连续FFT 仿真验证

基于FPGA的 DDS连续FFT 仿真验证 1 摘要 本文聚焦 AMD LogiCORE IP Fast Fourier Transform (FFT) 核心,深入剖析其在 FPGA 设计中的应用。该 FFT 核心基于 Cooley - Tukey 算法,具备丰富特性,如支持多种数据精度、算术类型及灵活的运行时配置。文中详细介绍了其架构选项、…

云原生分布式存储:数据洪流中的时空折叠艺术

引言:数据维度战争的新防线 蚂蚁集团存储集群达500EB规模,Netflix每日处理3PB视频数据。AWS S3支持每秒1.5亿次请求,字节跳动对象存储延迟低至12ms。IDC预测2026年全球存储开销达亿,沃尔玛每秒处理万笔交易日志,沙特阿…

使用LLaMA Factory微调导出模型,并用ollama运行,用open webui使用该模型

本篇记录学习使用llama factory微调模型的过程,使用ollama运行微调好的模型,使用open webui前端调用ollama的模型; 测试机信息: 系统:Ubuntu 24.04.2 LTS(桌面版) cpu:i9-14900KF …

超硬核区块链算法仿真:联盟链PBFT多线程仿真实现 :c语言完全详解版

1 22年年底想用gpt做出一个pbft的算法仿真&#xff0c;到了25年终于可以结合gpt grok perplexcity deepseek等实现了&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; #include <stdio.h> #include <stdlib.h> #include <windows.h> #inclu…

【Dive Into Stable Diffusion v3.5】1:开源项目正式发布——深入探索SDv3.5模型全参/LoRA/RLHF训练

目录 1 引言2 项目简介3 快速上手3.1 下载代码3.2 环境配置3.3 项目结构3.4 下载模型与数据集3.5 运行指令3.6 核心参数说明3.6.1 通用参数3.6.2 优化器/学习率3.6.3 数据相关 4 结语 1 引言 在人工智能和机器学习领域&#xff0c;生成模型的应用越来越广泛。Stable Diffusion…

【 <二> 丹方改良:Spring 时代的 JavaWeb】之 Spring MVC 的核心组件:DispatcherServlet 的工作原理

<前文回顾> 点击此处查看 合集 https://blog.csdn.net/foyodesigner/category_12907601.html?fromshareblogcolumn&sharetypeblogcolumn&sharerId12907601&sharereferPC&sharesourceFoyoDesigner&sharefromfrom_link <今日更新> 一、Dispat…

单机游戏的工作逻辑

一、单机游戏的通用设计 (一)地图和角色的表示 1、地图坐标通常用数组来存放。 例如&#xff1a;结构体数组&#xff0c;对象数组。 2、每个角色需要用结构体或者类封装坐标&#xff0c;其他参数 例如&#xff1a; // 封装角色的坐标&#xff0c;攻击值 class Role{ int x; …

深入了解Linux —— git三板斧

版本控制器git 为了我们方便管理不同版本的文件&#xff0c;就有了版本控制器&#xff1b; 所谓的版本控制器&#xff0c;就是能够了解到一个文件的历史记录&#xff08;修改记录&#xff09;&#xff1b;简单来说就是记录每一次的改动和版本迭代的一个管理系统&#xff0c;同…