好的,关于MySQL的常见面试题范围非常广,从基础的SQL语法到深层的原理和优化都有涉及。我为你整理了一个从浅入深、分类清晰的常见面试题清单,并附上一些考察点说明。
一、基础与SQL语法
-
三大范式是什么?
- 考察点:数据库设计规范化的理解。通常回答前三大范式即可,并能说明反范式设计的场景(为了性能)。
-
CHAR
和 VARCHAR
的区别是什么?
- 考察点:对基础数据类型的理解。
CHAR
是定长,浪费空间但效率高;VARCHAR
是变长,节省空间但效率稍低。
-
DATETIME
和 TIMESTAMP
的区别?
- 考察点:时间类型的区别。范围、存储空间、时区相关性(TIMESTAMP会随时区变化)是核心考点。
-
DROP
、DELETE
与 TRUNCATE
的区别?
- 考察点:对数据删除操作的理解。
DELETE
是DML,逐行删除,可回滚;TRUNCATE
是DDL,销毁表数据页,不可回滚;DROP
是删除整个表。
-
INNER JOIN
、LEFT JOIN
、RIGHT JOIN
、FULL JOIN
的区别?
- 考察点:多表连接查询的核心知识。必须能用韦恩图或自己的语言清晰描述。
-
什么是联合索引?它的原理是什么?最左前缀原则是什么?
- 考察点:索引知识的重中之重。必须能解释为什么
(a,b,c)
索引能用于查询a=?
、a=? and b=?
,但不能用于b=? and c=?
。
二、索引(Indexing)
-
为什么使用索引?索引的优缺点是什么?
- 考察点:索引的本质(提高查询效率,但降低增删改速度并占用空间)。
-
索引底层使用了什么数据结构?为什么用B+Tree而不是Hash或B-Tree?
- 考察点:对索引底层原理的理解。B+Tree支持范围查询、顺序扫描、树高更低是关键。
-
什么是聚簇索引( clustered index )和非聚簇索引( secondary index )?
- 考察点:InnoDB引擎的核心特性。聚簇索引的叶子节点存储整行数据,非聚簇索引的叶子节点存储主键值。
-
什么是回表查询?如何避免?
- 考察点:对非聚簇索引查询过程的理解。避免方法是使用覆盖索引(Covering Index)。
-
什么是覆盖索引?它的优点是什么?
- 考察点:高性能查询的优化手段。只需要通过索引就能拿到所有需要的字段,无需回表。
-
如何创建索引?有哪些原则?
- 考察点:实践经验。常用于
WHERE
、ORDER BY
、GROUP BY
的字段;区分度高的字段;联合索引的字段顺序等。
三、事务(Transaction)与锁(Locking)
-
什么是数据库事务?它的ACID特性是什么?
- 考察点:事务的基本概念。原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)必须能展开解释。
-
事务的隔离级别有哪些?MySQL的默认级别是什么?
- 考察点:
READ UNCOMMITTED
, READ COMMITTED
, REPEATABLE READ
(MySQL默认), SERIALIZABLE
。以及每个级别能解决哪些并发问题(脏读、不可重复读、幻读)。
-
什么是MVCC?它是如何工作的?
- 考察点:InnoDB实现高并发和非阻塞读的核心机制。需要理解
ReadView
、undo log、版本链等概念。
-
MySQL有哪些锁?
- 考察点:锁的分类。行锁 vs 表锁;共享锁(S锁)vs 排他锁(X锁);意向锁(IS/IX)。
-
什么是间隙锁(Gap Lock)和Next-Key Lock?
- 考察点:InnoDB在
REPEATABLE READ
级别下解决幻读问题的机制。
四、存储引擎(Storage Engines)
-
MyISAM 和 InnoDB 的区别是什么?
- 考察点:经典问题。从**事务**(InnoDB支持)、**锁粒度**(InnoDB支持行锁)、**外键**(InnoDB支持)、**崩溃恢复**、**count(*)操作**等方面对比。
-
InnoDB引擎的四大特性是什么?
- 考察点:插入缓冲(Change Buffer)、双写机制(Doublewrite)、自适应哈希索引(AHI)、预读(Read Ahead)。
五、性能调优与运维
-
如何定位和分析慢查询?
- 考察点:实战经验。回答开启慢查询日志,使用
EXPLAIN
分析SQL,使用show processlist
查看实时线程。
-
EXPLAIN命令结果中的关键字段有哪些?其含义是什么?
- 考察点:SQL性能分析的核心工具。**type**(访问类型,如const, ref, range, index, ALL)、**key**(使用的索引)、**rows**(预估扫描行数)、**Extra**(额外信息,如Using filesort, Using temporary)是重中之重。
-
什么情况下索引会失效?
- 考察点:索引使用的注意事项。例如:对索引列进行函数操作、计算、隐式类型转换、使用
!=
或<>
、LIKE
以通配符%
开头、OR条件前后未全部使用索引等。
-
数据库如何做优化?
- 考察点:综合性问题。可以从多个层面回答:
- SQL层面:优化慢查询,合理使用索引。
- 设计层面:合理的表结构、范式与反范式。
- 架构层面:主从复制、读写分离、分库分表。
- 硬件/配置层面:调整
innodb_buffer_pool_size
等参数。
-
什么是数据库的死锁?如何解决?
- 考察点:对并发问题的处理。MySQL会自动检测并回滚代价最小的事务。解决方法主要是优化业务逻辑和SQL,保证访问资源的顺序一致。
六、高级与架构
-
简述MySQL主从复制(Replication)的原理?
- 考察点:高可用和负载均衡的基础。三个线程(binlog dump thread, I/O thread, SQL thread)和日志(binlog, relay log)的工作流程。
-
什么是读写分离?如何实现?
- 考察点:扩展读性能的常见方案。通常配合主从复制,由程序或中间件(如MyCAT, ShardingSphere)路由读写请求。
-
什么是分库分表?为什么要分库分表?
- 考察点:解决海量数据和高并发问题的终极方案。分为垂直切分和水平切分,能解释其带来的好处和复杂性(如分布式事务、全局主键等)。
面试建议:
* 不要死记硬背,理解背后的原理和“为什么”更重要。
* 结合自己的项目经验,准备一两个你如何优化SQL、处理过数据库问题的实际案例。
* 对于高级问题,即使没在生产中用过,也要表明你了解其概念和适用场景。
这个清单几乎覆盖了从初级到高级的MySQL核心面试考点,熟练掌握它们将对你的面试大有裨益。
问题汇总
- mysql的存储引擎有哪些?他们有什么区别?
- mysql的锁有哪些?
- 什么是mysql的事务?
- mysql事务隔离级别有哪些?默认是哪个级别?
- mysql的索引有哪些类型?
- 聚集索引和非聚集索引有啥区别?
- 啥是mysql的回表?如何解决?
- mysql索引的底层数据结构是什么?
- B树和B+树有啥区别?
- 哪些情况回导致索引失效?
- 什么是脏读和幻读?
- 如何解决幻读?
- mysql的between是开区间,还是闭区间?
- 什么间隙锁?怎么使用?
- 如何知道sql查询是否使用了索引?
- 索引是否越多越好吗?为什么?
- 数据库设计三大范式是什么?
- 数据库事务的底层是如何实现?
- 哪些字段适合建索引?
- 哪些情况不适合建立索引?
- 说说你对复合索引的最左匹配原则的理解?