MySQL 5.7 vs MySQL 8.0 高频面试题解析

embedded/2025/3/19 20:00:38/

一、基础概念与核心差异

1. 默认字符集的变化

问:  MySQL 5.7 和 8.0 的默认字符集有何不同?为什么要修改?
答:

  • MySQL 5.7 默认字符集为 latin1,可能导致中文乱码。
  • MySQL 8.0 默认改为 utf8mb4(支持4字节编码,如表情符号),且默认排序规则为 utf8mb4_0900_ai_ci
    意义:彻底解决字符编码问题,兼容国际化需求。

2. 用户认证方式的演进

问:  从 5.7 到 8.0,用户密码认证方式有何变化?
答:

  • MySQL 5.7 使用 mysql_native_password 插件。
  • MySQL 8.0 默认使用 caching_sha2_password,提供更强的安全性,但旧客户端需更新驱动(如 JDBC 需升级到 8.0+)。
    注意:若需兼容旧版,可通过命令切换认证方式:
ALTER USER 'user'@'host' IDENTIFIED WITH mysql_native_password BY 'password';

二、新特性与功能增强

3. 窗口函数(Window Functions)

问:  MySQL 8.0 新增的窗口函数有什么作用?举例说明。
答:
窗口函数允许在不聚合数据的前提下进行复杂计算,典型场景如排名、累计统计。
示例:计算每个部门的薪资排名

SELECT name, department, salary,RANK() OVER (PARTITION BY department ORDER BY salary DESC) AS dept_rank
FROM employees;

对比:MySQL 5.7 需通过子查询或变量实现类似功能,代码更复杂。


4. 通用表表达式(CTE)

问:  什么是 CTE?与子查询有何区别?
答:

  • CTE(Common Table Expression)通过 WITH 子句定义临时结果集,提升复杂查询的可读性。
  • 支持递归查询(如树形结构遍历),MySQL 5.7 不支持。
    示例:递归查询组织架构
WITH RECURSIVE org_tree AS (SELECT id, name, parent_id FROM org WHERE parent_id IS NULLUNION ALLSELECT o.id, o.name, o.parent_id FROM org oJOIN org_tree ot ON o.parent_id = ot.id
)
SELECT * FROM org_tree;

三、性能优化与索引改进

5. 隐藏索引(Invisible Indexes)

问:  如何在不删除索引的情况下测试其对性能的影响?
答:
MySQL 8.0 支持将索引标记为“隐藏”,优化器会忽略它,但索引仍维护:

ALTER TABLE t1 ALTER INDEX idx_name INVISIBLE; 

用途:排查索引性能问题,避免频繁删除重建。


6. 直方图(Histograms)

问:  直方图如何优化查询计划?
答:
MySQL 8.0 引入直方图统计数据的分布(如某字段的数值分布不均时),帮助优化器选择更优的执行计划。
创建语法

ANALYZE TABLE table_name UPDATE HISTOGRAM ON column_name;

四、安全与管理增强

7. 原子DDL操作

问:  什么是原子DDL?解决了什么问题?
答:

  • MySQL 8.0 支持原子DDL,确保DDL操作(如创建表)要么完全成功,要么回滚到之前状态。
  • 解决5.7中因意外中断导致的元数据不一致问题(如部分文件残留)。

8. 角色管理(Role-Based Access)

问:  MySQL 8.0 的角色管理如何简化权限分配?
答:

  • 支持创建角色并批量分配权限,避免逐个用户授权。
    示例
CREATE ROLE developer;
GRANT SELECT, INSERT ON db.* TO developer;
GRANT developer TO user1@'%';

五、高频实战面试题

9. JSON功能增强

问:  对比5.7和8.0的JSON处理能力。
答:

  • MySQL 8.0 新增 JSON_TABLE()(将JSON转为表结构)、JSON_OVERLAPS()(检查JSON交集)、JSON_SCHEMA_VALID()(模式验证)等函数。
    示例:提取JSON数组中的值
SELECT * FROM JSON_TABLE('[{"id":1}, {"id":2}]', '$[*]' COLUMNS(id INT PATH '$.id')) AS jt;

10. 升级到MySQL 8.0的注意事项

问:  从5.7升级到8.0需要检查哪些内容?
答:
关键步骤:

  1. 使用 mysql_upgrade 工具更新系统表。
  2. 检查废弃关键字(如 ASC/DESC 索引排序语法)。
  3. 验证存储引擎兼容性(如不再支持 MyISAM 系统表)。
  4. 备份数据并测试回滚方案。

总结

MySQL 8.0 在性能、功能、安全性方面均有显著提升,面试中需重点掌握:

  • 窗口函数与CTE:复杂查询优化
  • 原子DDL与角色管理:运维效率提升
  • 索引与统计增强:执行计划优化
  • JSON与字符集改进:开发友好性

本文基于DBLens for MySQL这一专业化数据库管理开发工具,文中所有SQL逻辑均完成部署与验证。


http://www.ppmy.cn/embedded/173937.html

相关文章

深度探索DeepSeek部署的安全底线

摘要 在本地部署DeepSeek时,必须严格遵守安全底线。攻击者可能通过服务接口对DeepSeek模型数据进行篡改,包括删除模型或修改模型训练数据。此外,攻击者还可能注入恶意代码或删除关键组件,从而导致服务崩溃。因此,在部署…

【综述】An Introduction to Vision-Language Modeling【二】

介绍 第一节的内容 该文章对视觉语言模型进行介绍,解释了什么是视觉语言模型,怎么训练的,如果基于各种研究目标来有效评估它。这项工作不是一个现有工作的综述,而是对视觉语言模型进行清晰易理解的介绍,以便更好入门…

烽火HG680-KB_海思HI3798MV310_安卓9.0_U盘强刷固件包及注意点说明

之前发布过这个固件包,关于烽火HG680-KA/HG680-KB_海思HI3798MV310_安卓9.0_U盘强刷固件包详细说明一下,汇总总结一些常遇到的情况,这次固件会分开发布,以免混淆。 上一个帖子地址:烽火HG680-KA&#xff0…

OpenGL 将屏幕上的二维坐标转换为三维空间中的一个点

本文主要介绍将屏幕上的二维坐标转换为三维空间中的一个点,该点位于 近 平面上(即 Z 坐标为 -1)。 一、步骤概述 屏幕坐标到标准化设备坐标 (NDC): 将屏幕坐标 (x, y) 转换为 NDC 坐标系。NDC 到相机空间: 使用逆投影矩阵将 NDC 坐标转换到相…

实验篇| Nginx环境搭建-安全配置

在前面的文章里,阿祥详细介绍了在 Windows 系统中安装 Nginx 服务器的具体操作步骤,感兴趣的朋友可以参考:实验篇 | Nginx 反向代理 - 7 层代理 。完成 Nginx 的安装只是搭建 Web 服务的第一步,为了保障服务器的稳定运行以及数据安…

Python爬虫-爬取汽车之家燃油车月销量榜数据

前言 本文是该专栏的第48篇,后面会持续分享python爬虫干货知识,记得关注。 在本文中,笔者已整理18篇汽车平台相关的爬虫项目案例。对此感兴趣的同学,可以直接翻阅查看。 而本文,笔者将以汽车之家平台为例子。基于Python爬虫,实现批量爬取全部“燃油车”的月销量数据。废…

【面试中的分布式定时任务】

定时任务与分布式定时任务框架XXL-JOB详解 一、为什么需要定时任务? 定时任务在业务场景中非常常见,主要用于以下场景: 时间驱动处理: • 整点发送优惠券 • 每天更新收益 • 每天刷新标签数据和人群数据 批量处理数据&#xf…

微服务架构: SpringCloud实战案例

### 微服务架构: SpringCloud实战案例 一、什么是微服务架构 微服务架构是一种构建单个应用程序作为一组小服务的方法,这些服务都在其自己的进程中运行。每个服务都围绕业务能力构建,并通过轻量级通信机制,如HTTP资源API,与其他服…