网站首页 > 文章精选 正文
一、基础概念与核心差异
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+)。
注意:若需兼容旧版,可通过命令切换认证方式:
Bash
ALTER USER 'user'@'host' IDENTIFIED WITH mysql_native_password BY 'password';
二、新特性与功能增强
3.窗口函数(Window Functions)
问: MySQL 8.0 新增的窗口函数有什么作用?举例说明。
答:
窗口函数允许在不聚合数据的前提下进行复杂计算,典型场景如排名、累计统计。
示例:计算每个部门的薪资排名
Bash
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需要检查哪些内容?
答:
关键步骤:
- 使用 mysql_upgrade 工具更新系统表。
- 检查废弃关键字(如 ASC/DESC 索引排序语法)。
- 验证存储引擎兼容性(如不再支持 MyISAM 系统表)。
- 备份数据并测试回滚方案。
总结
MySQL 8.0 在性能、功能、安全性方面均有显著提升,面试中需重点掌握:
- 窗口函数与CTE:复杂查询优化
- 原子DDL与角色管理:运维效率提升
- 索引与统计增强:执行计划优化
- JSON与字符集改进:开发友好性
本文基于DBLens for MySQL这一专业化数据库管理开发工具,文中所有SQL逻辑均完成部署与验证。
猜你喜欢
- 2025-05-09 面试必问的 MySQL 四种隔离级别,看完吊打面试官
- 2025-05-09 面试官:mysql自增长id用完了怎么办?这是我见过最中肯的答案了
- 2025-05-09 阿里面试:MySQL Binlog有哪些格式?底层原理?优缺点?
- 2025-05-09 1.5万字+30张图盘点程序员面试必会MySQL索引常见的11个知识点
- 2025-05-09 面试中的老大难-mysql事务和锁,一次性讲清楚
- 2025-05-09 手把手指导Linux系统centos7安装数据库MySQL5.7
- 2025-05-09 面试官问我MySQL索引为啥用B+树?我让他去问作者
- 2025-05-09 MySQL面试题:自增ID达到上限了会出现什么问题?
- 2025-05-09 MySQL索引失效问题,看完手撕面试官
- 2025-05-09 阿里面试:MySQL死锁的原因?解决方案有哪些?
- 05-27网络试验系列——证明Telnet不安全
- 05-27http、TCP/IP协议与socket之间的区别(网络基础)
- 05-27如何开启telnet客户端
- 05-27TCP/IP协议详解
- 05-27网络中的网络层协议
- 05-27计算机网络的 89 个核心概念
- 05-27Linux中的curl,telnet,ping测试网络指令区别
- 05-27win11系统如何开启telnet服务(拷贝版本)
- 最近发表
- 标签列表
-
- newcoder (56)
- 字符串的长度是指 (45)
- drawcontours()参数说明 (60)
- unsignedshortint (59)
- postman并发请求 (47)
- python列表删除 (50)
- 左程云什么水平 (56)
- 计算机网络的拓扑结构是指() (45)
- 编程题 (64)
- postgresql默认端口 (66)
- 数据库的概念模型独立于 (48)
- 产生系统死锁的原因可能是由于 (51)
- 数据库中只存放视图的 (62)
- 在vi中退出不保存的命令是 (53)
- 哪个命令可以将普通用户转换成超级用户 (49)
- noscript标签的作用 (48)
- 联合利华网申 (49)
- swagger和postman (46)
- 结构化程序设计主要强调 (53)
- 172.1 (57)
- apipostwebsocket (47)
- 唯品会后台 (61)
- 简历助手 (56)
- offshow (61)
- mysql数据库面试题 (57)