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

发布于:2025-03-20 ⋅ 阅读:(20) ⋅ 点赞:(0)

一、基础概念与核心差异

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 NULL
    UNION ALL
    SELECT o.id, o.name, o.parent_id FROM org o
    JOIN 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逻辑均完成部署与验证。