# 常见的MySQL面试题有哪些 MySQL作为最流行的开源关系型数据库之一,是后端开发和数据库岗位面试的重点考察领域。本文将系统梳理高频MySQL面试题,涵盖基础概念、索引优化、事务机制、锁机制、性能调优等核心知识点,帮助求职者全面备战。 --- ## 一、基础概念篇 ### 1. 什么是MySQL?它的主要特点是什么? MySQL是由瑞典MySQL AB公司开发的关系型数据库管理系统(RDBMS),现属于Oracle旗下产品。核心特点包括: - 开源免费(社区版) - 支持多线程高并发 - 提供ACID事务支持 - 支持主从复制和集群部署 - 跨平台支持(Windows/Linux/macOS) ### 2. MySQL的存储引擎有哪些?区别是什么? | 存储引擎 | 事务支持 | 锁粒度 | 适用场景 | |---------|---------|--------|----------| | InnoDB | 支持 | 行级锁 | 需要事务、高并发写 | | MyISAM | 不支持 | 表级锁 | 读多写少、全文索引 | | MEMORY | 不支持 | 表级锁 | 临时表、高速缓存 | ### 3. CHAR和VARCHAR的区别? - **CHAR**:定长字符串(0-255字节),存储时会用空格填充到指定长度 - **VARCHAR**:变长字符串(0-65535字节),只占用实际长度+1-2字节长度标识 --- ## 二、索引与优化篇 ### 4. MySQL索引有哪些类型? - **按数据结构分**: - B+Tree索引(默认) - Hash索引(MEMORY引擎) - 全文索引(MyISAM支持) - **按逻辑分**: - 主键索引(PRIMARY KEY) - 唯一索引(UNIQUE KEY) - 普通索引(INDEX) - 组合索引(多列联合) ### 5. 什么是B+树索引?为什么MySQL选择它? B+树是B树的变种,特点包括: - 非叶子节点只存键值不存数据 - 叶子节点通过指针连接形成链表 - 所有数据都存储在叶子节点 **优势**: - 范围查询效率高(链表遍历) - 查询稳定性好(所有查询路径等长) - 磁盘IO次数少(3-4层可存百万级数据) ### 6. 什么情况下索引会失效? - 违反最左前缀原则(组合索引) - 对索引列进行运算或函数操作 - 使用`!=`、`NOT IN`等否定条件 - 隐式类型转换(如字符串列用数字查询) - `LIKE`以通配符开头('%abc') ### 7. EXPLN命令各字段含义? ```sql EXPLN SELECT * FROM users WHERE id = 1;
关键字段说明: - type:访问类型(const > ref > range > index > ALL) - key:实际使用的索引 - rows:预估扫描行数 - Extra:额外信息(Using filesort/Using temporary需优化)
隔离级别 | 脏读 | 不可重复读 | 幻读 | 实现方式 |
---|---|---|---|---|
读未提交 | ✓ | ✓ | ✓ | 无锁 |
读已提交 | × | ✓ | ✓ | 快照读 |
可重复读 | × | × | ✓ | MVCC+间隙锁 |
串行化 | × | × | × | 完全加锁 |
多版本并发控制(Multi-Version Concurrency Control)通过保存数据的历史版本实现: - 每行记录包含两个隐藏字段:创建版本号、删除版本号 - 读操作只查找版本号早于当前事务的数据 - 写操作创建新版本而非直接修改
SET GLOBAL slow_query_log = ON; SET GLOBAL long_query_time = 2;
mysqldumpslow
工具分析日志SHOW PROCESSLIST
查看当前运行线程SELECT *
,只查询必要字段SHOW SLAVE STATUS
监控复制状态-- 用户表 CREATE TABLE users ( user_id BIGINT PRIMARY KEY AUTO_INCREMENT, username VARCHAR(50) UNIQUE, password CHAR(60) ); -- 商品表 CREATE TABLE products ( product_id BIGINT PRIMARY KEY, name VARCHAR(100), price DECIMAL(10,2), INDEX idx_name (name) ); -- 订单表(分库分表场景) CREATE TABLE orders_2023 ( order_id VARCHAR(32) PRIMARY KEY, user_id BIGINT, status TINYINT, create_time DATETIME, INDEX idx_user (user_id) ) PARTITION BY RANGE (YEAR(create_time));
方案对比: 1. 悲观锁:
SELECT quantity FROM inventory WHERE item_id=1 FOR UPDATE; UPDATE inventory SET quantity=quantity-1 WHERE item_id=1;
UPDATE inventory SET quantity=quantity-1, version=version+1 WHERE item_id=1 AND version=#{version};
RANK()
, ROW_NUMBER()
等WITH
语法支持JSON_TABLE()
等函数本文覆盖了MySQL面试中最常考察的7大方向共20个核心问题。实际面试中,面试官往往会根据候选人的回答深度进行追问,建议: 1. 对每个知识点至少掌握2-3层深度 2. 准备1-2个实际项目中的MySQL优化案例 3. 动手实验关键机制(如事务隔离级别、锁竞争等)
注:本文约2200字,可根据实际需要调整内容深度或补充具体案例。 “`
这篇文章采用Markdown格式编写,包含: 1. 层级分明的章节结构 2. 表格对比关键概念差异 3. 代码块展示SQL示例 4. 重点内容加粗/列表突出显示 5. 覆盖基础到高级的知识点 6. 包含实战设计题和解决方案
可根据具体面试岗位需求,适当调整技术深度或增加云数据库、分布式事务等扩展内容。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。