MySQL 作为目前最广泛使用的关系型数据库之一,许多互联网大厂在招聘时都会重点考察应聘者对数据库相关知识的掌握程度。在 MySQL 面试中,面试官往往会关注以下几个方面的内容:数据库设计、性能优化、事务处理、索引等。本文将重点分析一些常见的 MySQL 面试问题,并提供详细解析。
编辑
1. 数据库隔离级别
数据库的隔离级别定义了事务在并发执行时的行为。MySQL 支持以下四种隔离级别:
- 读未提交(READ UNCOMMITTED):允许一个事务读取另一个事务尚未提交的数据,可能会发生脏读(dirty read)。
- 读已提交(READ COMMITTED):只允许读取已提交的事务数据,避免了脏读,但仍然可能会发生不可重复读(non-repeatable read)。
- 可重复读(REPEATABLE READ):保证在同一个事务内多次读取同一数据时结果一致,避免了脏读和不可重复读,但可能会出现幻读(phantom read)。
- 串行化(SERIALIZABLE):最高的隔离级别,强制事务串行执行,避免了所有并发问题,但会降低并发性能。
推荐 :通常使用 可重复读(REPEATABLE READ)作为 MySQL 的默认隔离级别,能有效保证事务的一致性和隔离性。
2. 数据库引擎
编辑
MySQL 支持多个存储引擎,常见的两个存储引擎是:
- InnoDB:MySQL 默认的存储引擎,支持事务、行级锁、外键等,适用于高并发、高可用的场景。
- MyISAM:不支持事务和外键,但由于其较低的存储成本和较高的查询性能,适合读多写少的场景。
总结:InnoDB 是更为常用的引擎,尤其适合 OLTP 系统,而 MyISAM 适用于对事务性要求较低的系统。
3. MySQL 的所有锁
MySQL 中的锁主要分为以下几类:
- 表锁(Table Locks):对整个表进行锁定,其他线程不能对该表进行写操作,但读取操作仍然可以进行。
- 行锁(Row Locks):对某一行数据进行锁定,允许其他事务访问表中的其他行数据,适用于并发写入的场景。InnoDB 支持行级锁。
- 意向锁(Intention Locks):InnoDB 中的一种锁,表示事务打算对某一行或某些行进行锁定,主要用于与表锁结合使用。
- 自增锁(Auto-increment Locks):MySQL 为了保证自增字段的唯一性,会使用此锁来保证自增值的正确性。
4. 分页查询语句
常见的分页查询语句如下:
sql
SELECT * FROM table_name LIMIT 10 OFFSET 20;
其中,LIMIT 10 表示每页显示10条数据,OFFSET 20 表示从第21条记录开始查询。
5. 500页数据查第400页很慢,原因与解决方案
分页查询慢的原因一般有以下几点:
- 大量数据扫描:在查询较高页数时,数据库需要扫描大量的记录,导致查询性能下降。
- 索引缺失:如果没有针对查询字段建立合适的索引,数据库查询速度会大幅下降。
解决方案:
- 使用 索引,尤其是主键索引或其他频繁查询的字段的索引。
- 使用 覆盖索引,使查询能够仅通过索引获取数据,避免回表。
- 尝试 ID范围分页,如按主键范围分页,减少数据扫描量。
6. 数据库的悲观锁与乐观锁
- 悲观锁(Pessimistic Locking) :假设会发生并发冲突,因此在事务处理过程中,始终对数据加锁,防止其他事务访问。
- 例如:
SELECT ... FOR UPDATE。
- 例如:
- 乐观锁(Optimistic Locking):假设不会发生并发冲突,只有在提交事务时,才会检查数据是否有变化,通常通过版本号或时间戳来实现。
7. B树与B+树的区别
- B树:每个节点包含数据和指向子节点的指针。查询时,查找的数据可能不在叶子节点。
- B+树:所有数据都在叶子节点,内节点仅存储指向子节点的指针。B+树的查询性能更高,适用于范围查询。
8. MyISAM与InnoDB的区别
- MyISAM :
- 不支持事务。
- 只支持表级锁。
- 数据库崩溃时可能导致数据丢失。
- InnoDB :
- 支持事务、行级锁、外键。
- 支持 ACID 特性。
- 数据库崩溃时能够保证数据一致性。
9. 为何不建议使用LIMIT
- 性能问题 :当数据量非常大时,
LIMIT可能会导致大量数据的扫描和排序,特别是分页查询时,性能非常差。 - 解决方法:如前所述,使用 ID 范围查询或者利用索引来优化分页查询。
10. 查询所有成绩大于80的学生姓名
sql
SELECT sname
FROM student a
JOIN (
SELECT course, MAX(score)
FROM student
GROUP BY course
) b
ON a.course = b.course
AND a.score = b.score
WHERE a.score > 80;
11. 数据库索引、聚簇索引与非聚簇索引
- 索引:是一种数据结构,用于提高查询效率。
- 聚簇索引(Clustered Index):数据存储顺序与索引顺序相同,InnoDB 默认使用聚簇索引。
- 非聚簇索引(Non-Clustered Index):索引与数据存储顺序不一致,查询时需要回表。
12. 三范式
三范式的目标是减少数据冗余和依赖,具体包括:
- 第一范式(1NF):确保每列都是原子性的。
- 第二范式(2NF):确保消除部分依赖,即每个非主键字段完全依赖于主键。
- 第三范式(3NF):确保消除传递依赖,即非主键字段不依赖于其他非主键字段。
13. ACID
ACID 是事务的四个基本特性:
- 原子性(Atomicity):事务中的操作要么全部成功,要么全部失败。
- 一致性(Consistency):事务执行前后,数据库的一致性约束不会被破坏。
- 隔离性(Isolation):事务之间是相互独立的。
- 持久性(Durability):事务一旦提交,其结果是永久的。
14. 关于大表分页优化
- 避免使用 OFFSET :通过
WHERE语句限制 ID 范围来进行分页。 - 分区表:将数据按某一字段分区,减少查询的数据量。
- 索引优化:确保查询字段有合适的索引,避免全表扫描。
15. 数据库的主从复制的优缺点
- 优点 :
- 提高读取性能,分担读取负载。
- 增强数据的可用性,通过备份来确保数据安全。
- 缺点 :
- 数据同步延迟:主节点的更新可能会延迟到从节点。
- 复杂的维护:主从复制在节点故障、数据一致性等方面需要额外的处理。
通过对这些关键技术点的理解,候选人可以在面试过程中更加自信地回答 MySQL 相关的问题,展现出扎实的数据库基础。