MySQL 5.7 vs MySQL 8.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逻辑均完成部署与验证。

在CentOS系统上将MySQL 5.7升级至MySQL 8.0可按以下步骤进行: ### 1. 备份数据 在进行升级操作之前,务必对现有的MySQL数据库进行完整备份,以防止数据丢失。可以使用`mysqldump`命令来备份所有数据库: ```bash mysqldump -u root -p --all-databases > all_databases_backup.sql ``` ### 2. 停止MySQL 5.7服务 使用以下命令停止正在运行的MySQL 5.7服务: ```bash systemctl stop mysqld ``` ### 3. 移除MySQL 5.7的Yum仓库 若通过Yum安装的MySQL 5.7,需要移除相关的Yum仓库文件: ```bash rm -rf /etc/yum.repos.d/mysql-community.repo ``` ### 4. 安装MySQL 8.0的Yum仓库 下载并安装MySQL 8.0的Yum仓库文件: ```bash wget https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm rpm -ivh mysql80-community-release-el7-3.noarch.rpm ``` ### 5. 安装MySQL 8.0 使用Yum安装MySQL 8.0: ```bash yum install mysql-community-server ``` ### 6. 启动MySQL 8.0服务 安装完成后,启动MySQL 8.0服务并设置开机自启: ```bash systemctl start mysqld systemctl enable mysqld ``` ### 7. 初始化MySQL 8.0 MySQL 8.0安装后需要进行初始化操作,可通过以下命令完成: ```bash mysql_secure_installation ``` 按照提示设置root用户密码、移除匿名用户、禁止root远程登录等。 ### 8. 升级系统表 使用以下命令升级系统表: ```bash mysql_upgrade -u root -p ``` 输入root用户密码后,系统会自动升级系统表。 ### 9. 验证升级结果 登录MySQL 8.0,查看版本信息: ```bash mysql -u root -p ``` 在MySQL命令行中执行以下命令: ```sql SELECT VERSION(); ``` 若显示为MySQL 8.0的版本号,则表示升级成功。 ### 10. 恢复数据 若之前进行了数据备份,可使用以下命令恢复数据: ```bash mysql -u root -p < all_databases_backup.sql ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值