MySQL常见面试题
大约 4 分钟
MySQL常见面试题
1. MySQL 基础
1.1 什么是关系型数据库?
关系型数据库是一种使用 行和列的表格结构 存储和管理数据的数据库模型,数据之间通过关系(如主键和外键)关联。
- 常见的关系型数据库有:MySQL、PostgreSQL、Oracle、SQL Server 等。
1.2 什么是 SQL?
SQL(Structured Query Language)是用于操作和查询关系型数据库的标准语言,包括数据定义、查询、更新和控制。
1.3 什么是 MySQL?
MySQL 是一种 开源的关系型数据库管理系统,由 Oracle 公司维护,广泛应用于小型到大型项目的数据库管理。
1.4 MySQL 有什么优点?
- 高性能:支持高并发,满足多数业务需求。
- 可扩展性强:支持分布式存储和读写分离。
- 支持多种存储引擎:如 InnoDB、MyISAM。
- 开源和免费:拥有广泛的社区支持。
- 支持多种操作系统:如 Windows、Linux、MacOS。
1.5 MySQL 字段类型
1.5.1 整数类型的 UNSIGNED 属性有什么用?
- UNSIGNED 表示无符号整数,范围为正数。
- 用途:避免负值,提高存储范围。
- 示例:
TINYINT UNSIGNED的范围为0 ~ 255,而TINYINT为-128 ~ 127。
- 示例:
1.5.2 CHAR 和 VARCHAR 的区别是什么?
- CHAR:固定长度,存储定长数据,效率高。
- VARCHAR:可变长度,存储变长数据,节省空间。
- 用法场景:
- CHAR:适合存储长度固定的数据(如身份证号)。
- VARCHAR:适合存储长度不确定的数据(如用户名)。
1.5.3 VARCHAR(100) 和 VARCHAR(10) 的区别是什么?
- VARCHAR(100) 表示最多可存储 100 个字符,VARCHAR(10) 最多存储 10 个字符。
- 注意:VARCHAR 不会占用多余的存储空间,仅根据实际字符分配。
1.5.4 DECIMAL 和 FLOAT/DOUBLE 的区别是什么?
- DECIMAL:精确存储,用于财务计算。
- FLOAT/DOUBLE:近似存储,速度快,但可能有精度损失。
- 用法场景:涉及金额等场景时推荐使用 DECIMAL。
1.5.5 为什么不推荐使用 TEXT 和 BLOB?
- 不支持索引,查询性能差。
- 每次存取都需要额外的磁盘 I/O。
- 替代方案:尽量使用 VARCHAR 或 JSON 存储文本数据。
1.5.6 DATETIME 和 TIMESTAMP 的区别是什么?
- DATETIME:存储绝对时间,不受时区影响。
- TIMESTAMP:存储相对时间,受时区影响,适合记录日志。
1.5.7 NULL 和 '' 的区别是什么?
- NULL:表示数据缺失或未知。
- '':表示空字符串,长度为 0。
- 注意:NULL 需要额外存储空间,尽量避免大量使用。
1.5.8 Boolean 类型如何表示?
- MySQL 中没有 Boolean 类型,可以用 TINYINT(1) 表示:
- 1:表示 TRUE。
- 0:表示 FALSE。
2. MySQL 存储引擎
2.1 MySQL 支持哪些存储引擎?默认使用哪个?
- 支持的引擎包括:
- InnoDB:支持事务、行级锁、高并发,默认引擎。
- MyISAM:不支持事务,支持表级锁,适合只读场景。
- Memory:数据存储在内存中,速度快,数据不持久化。
- Archive:适合存储历史数据,支持高压缩率。
- 默认引擎:从 MySQL 5.5 开始,默认使用 InnoDB。
2.2 MyISAM 和 InnoDB 有什么区别?
| 特性 | MyISAM | InnoDB |
|---|---|---|
| 事务支持 | 不支持 | 支持 |
| 锁类型 | 表级锁 | 行级锁 |
| 外键支持 | 不支持 | 支持 |
| 适用场景 | 只读、大量查询 | 写多、事务、多用户并发 |
| 崩溃恢复 | 不支持 | 支持 |
3. MySQL 事务
3.1 何谓事务?
事务是指一组 SQL 操作的集合,这些操作要么全部执行成功,要么全部失败回滚。
3.2 并发事务带来的问题
- 脏读:读取了未提交的事务数据。
- 不可重复读:同一事务中多次读取的数据不一致。
- 幻读:事务中读取了新增的数据行。
3.3 SQL 标准的事务隔离级别
| 隔离级别 | 脏读 | 不可重复读 | 幻读 |
|---|---|---|---|
| 读未提交 | 是 | 是 | 是 |
| 读已提交 | 否 | 是 | 是 |
| 可重复读 | 否 | 否 | 是 |
| 串行化 | 否 | 否 | 否 |
- MySQL 默认隔离级别:可重复读(REPEATABLE READ)。
4. MySQL 锁
4.1 表级锁和行级锁的区别
- 表级锁:锁住整张表,开销小,适合查询多的场景。
- 行级锁:锁住指定的行,开销大,适合写多的场景。
4.2 InnoDB 的行锁
- 共享锁:允许并发读取。
- 排他锁:阻止其他事务访问。
4.3 当前读和快照读
- 当前读:读取最新版本的数据,使用锁。
- 快照读:读取历史版本数据,无锁操作,适合 MVCC。
5. MySQL 性能优化
5.1 常见 SQL 优化手段
- 使用索引:提高查询效率。
- **避免 SELECT ***:只查询必要字段。
- 减少 JOIN 的使用:尤其是多表连接。
- 分区分表:优化大表查询性能。
5.2 深度分页优化
- 使用覆盖索引替代传统的 OFFSET。
- 示例:
SELECT id, name FROM table WHERE id > 1000 LIMIT 10;
5.3 数据冷热分离
- 热数据:高频访问的数据,存储在性能高的硬件中。
- 冷数据:低频访问的数据,存储在廉价硬件或分库中。
6. 学习资料推荐
- 官方文档:MySQL Reference Manual
- 《高性能 MySQL》—— 深入学习优化。
- 在线学习平台,如 LeetCode 的 SQL 题库。
