温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

常见的MySQL面试题有哪些

发布时间:2021-10-09 15:40:32 来源:亿速云 阅读:174 作者:iii 栏目:编程语言
# 常见的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需优化)


三、事务与锁篇

8. 什么是事务的ACID特性?

  • Atomicity(原子性):事务是不可分割的工作单位
  • Consistency(一致性):事务执行前后数据库状态一致
  • Isolation(隔离性):并发事务间相互隔离
  • Durability(持久性):事务提交后改变永久有效

9. MySQL的隔离级别有哪些?

隔离级别 脏读 不可重复读 幻读 实现方式
读未提交 无锁
读已提交 × 快照读
可重复读 × × MVCC+间隙锁
串行化 × × × 完全加锁

10. 什么是MVCC?

多版本并发控制(Multi-Version Concurrency Control)通过保存数据的历史版本实现: - 每行记录包含两个隐藏字段:创建版本号、删除版本号 - 读操作只查找版本号早于当前事务的数据 - 写操作创建新版本而非直接修改

11. InnoDB有哪几种锁?

  • 行锁:共享锁(S锁)、排他锁(X锁)
  • 表锁:意向共享锁(IS)、意向排他锁(IX)
  • 间隙锁(Gap Lock):防止幻读,锁定索引记录间隙
  • 临键锁(Next-Key Lock):行锁+间隙锁组合

四、性能优化篇

12. 大表优化的常见方案

  1. 垂直拆分:将不常用字段拆分到扩展表
  2. 水平拆分:按时间/ID范围分表(如user_2023)
  3. 读写分离:主库写,从库读
  4. 冷热分离:历史数据归档

13. 慢查询如何排查?

  1. 开启慢查询日志:
SET GLOBAL slow_query_log = ON; SET GLOBAL long_query_time = 2; 
  1. 使用mysqldumpslow工具分析日志
  2. 通过SHOW PROCESSLIST查看当前运行线程

14. 如何优化JOIN查询?

  • 确保关联字段有索引
  • 小表驱动大表(MySQL优化器会自动处理)
  • 避免SELECT *,只查询必要字段
  • 考虑使用冗余字段避免多表关联

五、高可用与架构篇

15. 主从复制原理是什么?

  1. Master将变更写入binlog
  2. Slave的IO线程拉取binlog到relay log
  3. Slave的SQL线程重放relay log中的事件
  4. 通过SHOW SLAVE STATUS监控复制状态

16. 分库分表有哪些策略?

  • 水平分片:按行分散(如user表按ID取模)
  • 垂直分片:按列分散(如将大字段单独存放)
  • 中间件方案:ShardingSphere、MyCat等

17. 如何保证数据库高可用?

  • 主从切换:MHA、Orchestrator等工具
  • 集群方案:MySQL Group Replication
  • 云数据库:AWS RDS Multi-AZ部署

六、实战应用题

18. 设计一个电商系统的数据库

-- 用户表 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)); 

19. 如何处理库存超卖问题?

方案对比: 1. 悲观锁

SELECT quantity FROM inventory WHERE item_id=1 FOR UPDATE; UPDATE inventory SET quantity=quantity-1 WHERE item_id=1; 
  1. 乐观锁
UPDATE inventory SET quantity=quantity-1, version=version+1 WHERE item_id=1 AND version=#{version}; 
  1. Redis原子操作:DECR + Lua脚本保证原子性

七、最新特性篇(MySQL 8.0+)

20. MySQL 8.0的重要新特性

  • 窗口函数RANK(), ROW_NUMBER()
  • CTE(公共表表达式)WITH语法支持
  • 原子DDL:数据定义语句支持事务
  • JSON增强:新增JSON_TABLE()等函数
  • 隐藏索引:可临时禁用索引而不删除

总结

本文覆盖了MySQL面试中最常考察的7大方向共20个核心问题。实际面试中,面试官往往会根据候选人的回答深度进行追问,建议: 1. 对每个知识点至少掌握2-3层深度 2. 准备1-2个实际项目中的MySQL优化案例 3. 动手实验关键机制(如事务隔离级别、锁竞争等)

注:本文约2200字,可根据实际需要调整内容深度或补充具体案例。 “`

这篇文章采用Markdown格式编写,包含: 1. 层级分明的章节结构 2. 表格对比关键概念差异 3. 代码块展示SQL示例 4. 重点内容加粗/列表突出显示 5. 覆盖基础到高级的知识点 6. 包含实战设计题和解决方案

可根据具体面试岗位需求,适当调整技术深度或增加云数据库、分布式事务等扩展内容。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI