整理自 MySQL 面试题 40 道,已精简冗余表述。详细原理见 MySQL 基础。
相关学习笔记
| 专题 | 笔记 |
|---|---|
| MySQL 基础 | MySQL 基础 |
目录
引擎与锁
1. MySQL 中有哪几种锁
- 表锁:开销小、加锁快、无死锁、粒度大、并发低
- 行锁:开销大、加锁慢、可能死锁、粒度小、并发高(InnoDB)
- 页锁:介于表锁与行锁之间
2. MySQL 中有哪些不同的表格(存储引擎)
常见:MyISAM、InnoDB、Memory(Heap)、Merge 等。生产默认 InnoDB。
3. MyISAM 和 InnoDB 的区别
| 维度 | MyISAM | InnoDB |
|---|---|---|
| 事务 | 否 | 是 |
| 锁 | 表锁 | 行锁 |
| 外键 | 否 | 是 |
| 总行数 | 保存 | 不保存 |
| 索引 | 非聚集 | 聚集索引 + 二级索引 |
| 文件 | .frm/.MYD/.MYI | 表空间 |
→ MySQL 基础
4. InnoDB 四种事务隔离级别
- READ UNCOMMITTED:读未提交
- READ COMMITTED:读已提交,可能不可重复读
- REPEATABLE READ:可重复读(InnoDB 默认)
- SERIALIZABLE:串行化
级别越高,一致性越强,并发越低。
事务与类型
5. CHAR 和 VARCHAR 的区别
CHAR 定长,不足补空格,检索去尾随空格;VARCHAR 变长,省空间。短且长度固定用 CHAR,多数用 VARCHAR。
6. 主键和候选键有什么区别
候选键是能唯一标识一行的属性集;主键是从候选键中选出的唯一标识,一张表只有一个主键,可作外键引用。
7. myisamchk 是用来做什么的
压缩、修复 MyISAM 表,减少磁盘或内存占用(InnoDB 用其他方式维护)。
8. TIMESTAMP、AUTO_INCREMENT 相关问题
- TIMESTAMP:行更新时可自动刷新为当前时间(视定义而定)
- AUTO_INCREMENT 达上限后再插入会失败
- LAST_INSERT_ID() 返回本连接最后一次自增值
9. 怎么查看表定义的所有索引
SHOW INDEX FROM 表名;10. LIKE 中 % 和 _ 的含义
% 匹配 0 个或多个字符;_ 匹配单个字符。% 开头通常无法走索引。
11. 列对比运算符有哪些
=, <>, <, >, <=, >=, <<, >>, <=>, AND, OR, LIKE 等。
12. BLOB 和 TEXT 有什么区别
都是存大对象;BLOB 二进制,排序比较区分大小写;TEXT 字符型,排序一般不区分大小写。
13. mysql_fetch_array 和 mysql_fetch_object 的区别
(PHP 旧 API,面试常作概念题)
fetch_array:关联数组或数字数组fetch_object:对象属性形式
Java 对应 JDBC ResultSet 按列名或下标取值。
14. MyISAM 表格存储在哪里?格式是什么
磁盘上三个文件:.frm(结构)、.MYD(数据)、.MYI(索引)。
15. MySQL 如何优化 DISTINCT
内部常转为 GROUP BY;可结合索引、避免多表大范围 DISTINCT,示例:
SELECT DISTINCT t1.a FROM t1, t2 WHERE t1.a = t2.a;16. 如何显示前 50 行
SELECT * FROM table LIMIT 0, 50;-- 或 LIMIT 50 OFFSET 017. 可以使用多少列创建索引
单表最多约 16 列组成一个索引(版本可能有差异,以官方文档为准)。
18. NOW() 和 CURRENT_DATE() 有什么区别
NOW():日期+时间;CURRENT_DATE():仅日期。
19. 什么是非标准字符串类型
TINYTEXT、TEXT、MEDIUMTEXT、LONGTEXT 等。
20. 什么是通用 SQL 函数
CONCAT、FORMAT、CURDATE/CURTIME、NOW、MONTH/DAY/YEAR、DATEDIFF、SUBTIMES、FROM_DAYS 等。
21. MySQL 支持事务吗
默认 autocommit=1,每条语句自动提交。使用 InnoDB(或 BDB)并 SET autocommit=0 或显式 START TRANSACTION 可开启事务,配合 COMMIT/ROLLBACK。
22. 记录货币用什么字段类型
DECIMAL(p,s),精确小数,避免 FLOAT/DOUBLE 误差。例:salary DECIMAL(9,2) 表示共 9 位、2 位小数。
23. MySQL 权限表有哪些
mysql 库中:user、db、table_priv、columns_priv、host 等(由 mysql_install_db 初始化)。
24. 列的字符串类型可以是什么
CHAR、VARCHAR、TEXT、BLOB、ENUM、SET 等。
SQL 与索引
25. 发布系统一天五万条增量,运维三年怎么优化
- 表结构合理,适度冗余,减少大 JOIN
- 合适类型与引擎 + 索引
- 读写分离
- 分表降低单表数据量
- 缓存(Redis 等)
- 静态化不常变页面
- 高效 SQL,避免
SELECT *
26. 锁的优化策略
读写分离;分段加锁;缩短持锁时间;多线程相同顺序获取锁;避免锁粒度过细导致频繁加解锁。
27. 索引的底层实现原理
InnoDB 常用 B+ 树:叶子存数据且链表相连,适合范围扫描;非叶子只存索引。建议自增主键减少页分裂。
28. 什么情况下设置了索引但无法使用
- 左模糊
LIKE '%a' OR一侧无索引- 隐式类型转换
- 对索引列运算或函数
- 不满足联合索引最左前缀
29. 实践中如何优化 MySQL
顺序:SQL 与索引 → 表结构 → 参数配置 → 硬件。
30. 优化数据库的方法
合适字段类型、NOT NULL、用 ENUM 存固定枚举;JOIN 代替子查询;索引;控制事务;避免不必要锁表;优化查询语句。
31. 索引、主键、唯一索引、联合索引的区别与对性能的影响
- 普通索引:加速查询,允许重复
- 唯一索引:值唯一
- 主键:唯一且非空的聚集索引入口
- 联合索引:多列,遵循最左前缀
读快写慢:插入/更新/删除需维护索引。
32. 数据库中的事务是什么
一组 SQL 的逻辑单元,ACID:原子性、一致性、隔离性、持久性。失败则回滚,成功则提交。
33. SQL 注入原因与防止
原因:拼接 SQL 未过滤用户输入。
防止:预编译、参数绑定、输入校验、最小权限、过滤危险关键字、规范命名。
34. 为表中字段选择合适数据类型
优先级:整型 > 日期/时间 > ENUM/CHAR > VARCHAR > TEXT/BLOB;同等级选占用更小的类型。
35. 存储日期时间用哪种类型
- DATETIME:8 字节,范围大,与时区无关
- TIMESTAMP:4 字节,2038 上限,受时区影响
- DATE:仅日期,3 字节,适合生日等
避免用字符串存时间;一般不直接用 int 存时间(不如 TIMESTAMP 语义清晰)。
36. 索引的目的、负面影响、建立原则、不宜建立的情况
目的:加快检索、唯一约束、加速 JOIN/排序分组。
负面:占空间、维护成本、拖慢写操作。
原则:高频过滤/排序/连接列建索引。
不宜:低选择性列、大量重复值、TEXT 等大字段全文索引需专门方案。
连接与约束
37. 外连接、内连接与自连接的区别
- 交叉连接:笛卡尔积
- 内连接:只返回匹配行
- 左/右外连接:保留主表全部行,从表无匹配为 NULL
- 自连接:同表不同别名连接
MySQL 不支持全外连接(可用 UNION 模拟)。
38. MySQL 事务回滚机制概述
事务中任一步失败,ROLLBACK 撤销已做修改,两表更新要么都成功要么都回到事务前状态。
39. SQL 语言包括哪几部分
- DDL:
CREATE、ALTER、DROP - DML:
SELECT、INSERT、UPDATE、DELETE - DCL:
GRANT、REVOKE - DQL:查询(常归入 DML)
40. 完整性约束包括哪些
- 实体完整性:主键唯一
- 域完整性:类型、范围、NOT NULL
- 参照完整性:外键一致
- 用户定义完整性:业务规则
表约束:PRIMARY KEY、FOREIGN KEY、UNIQUE、CHECK、NOT NULL 等。