问: MySQL 5.7 和 8.0 的默认字符集有何不同?为什么要修改?
答:
latin1
,可能导致中文乱码。utf8mb4
(支持4字节编码,如表情符号),且默认排序规则为 utf8mb4_0900_ai_ci
。问: 从 5.7 到 8.0,用户密码认证方式有何变化?
答:
mysql_native_password
插件。caching_sha2_password
,提供更强的安全性,但旧客户端需更新驱动(如 JDBC 需升级到 8.0+)。ALTER USER 'user'@'host' IDENTIFIED WITH mysql_native_password BY 'password';
问: MySQL 8.0 新增的窗口函数有什么作用?举例说明。
答:
窗口函数允许在不聚合数据的前提下进行复杂计算,典型场景如排名、累计统计。
示例:计算每个部门的薪资排名
SELECT
name, department, salary,
RANK() OVER (PARTITION BY department ORDER BY salary DESC) AS dept_rank
FROM employees;
对比:MySQL 5.7 需通过子查询或变量实现类似功能,代码更复杂。
问: 什么是 CTE?与子查询有何区别?
答:
WITH
子句定义临时结果集,提升复杂查询的可读性。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;
问: 如何在不删除索引的情况下测试其对性能的影响?
答:
MySQL 8.0 支持将索引标记为“隐藏”,优化器会忽略它,但索引仍维护:
ALTER TABLE t1 ALTER INDEX idx_name INVISIBLE;
用途:排查索引性能问题,避免频繁删除重建。
问: 直方图如何优化查询计划?
答:
MySQL 8.0 引入直方图统计数据的分布(如某字段的数值分布不均时),帮助优化器选择更优的执行计划。
创建语法:
ANALYZE TABLE table_name UPDATE HISTOGRAM ON column_name;
问: 什么是原子DDL?解决了什么问题?
答:
问: MySQL 8.0 的角色管理如何简化权限分配?
答:
CREATE ROLE developer;
GRANT SELECT, INSERT ON db.* TO developer;
GRANT developer TO user1@'%';
问: 对比5.7和8.0的JSON处理能力。
答:
JSON_TABLE()
(将JSON转为表结构)、JSON_OVERLAPS()
(检查JSON交集)、JSON_SCHEMA_VALID()
(模式验证)等函数。SELECT * FROM JSON_TABLE('[{"id":1}, {"id":2}]', '$[*]' COLUMNS(id INT PATH '$.id')) AS jt;
问: 从5.7升级到8.0需要检查哪些内容?
答:
关键步骤:
mysql_upgrade
工具更新系统表。ASC/DESC
索引排序语法)。MyISAM
系统表)。MySQL 8.0 在性能、功能、安全性方面均有显著提升,面试中需重点掌握:
本文基于DBLens for MySQL这一专业化数据库管理开发工具,文中所有SQL逻辑均完成部署与验证。