MySQL 面试题 40 道

笔记/Java/面试专栏/MySQL 面试题 40 道

整理自 MySQL 面试题 40 道,已精简冗余表述。详细原理见 MySQL 基础

相关学习笔记#

专题笔记
MySQL 基础MySQL 基础

目录#


引擎与锁#

1. MySQL 中有哪几种锁#

  • 表锁:开销小、加锁快、无死锁、粒度大、并发低
  • 行锁:开销大、加锁慢、可能死锁、粒度小、并发高(InnoDB)
  • 页锁:介于表锁与行锁之间

2. MySQL 中有哪些不同的表格(存储引擎)#

常见:MyISAMInnoDB、Memory(Heap)、Merge 等。生产默认 InnoDB

3. MyISAM 和 InnoDB 的区别#

维度MyISAMInnoDB
事务
表锁行锁
外键
总行数保存不保存
索引非聚集聚集索引 + 二级索引
文件.frm/.MYD/.MYI表空间

MySQL 基础

4. InnoDB 四种事务隔离级别#

  1. READ UNCOMMITTED:读未提交
  2. READ COMMITTED:读已提交,可能不可重复读
  3. REPEATABLE READ:可重复读(InnoDB 默认)
  4. 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 0

17. 可以使用多少列创建索引#

单表最多约 16 列组成一个索引(版本可能有差异,以官方文档为准)。

18. NOW() 和 CURRENT_DATE() 有什么区别#

NOW():日期+时间;CURRENT_DATE():仅日期。

19. 什么是非标准字符串类型#

TINYTEXTTEXTMEDIUMTEXTLONGTEXT 等。

20. 什么是通用 SQL 函数#

CONCATFORMATCURDATE/CURTIMENOWMONTH/DAY/YEARDATEDIFFSUBTIMESFROM_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 库中:userdbtable_privcolumns_privhost 等(由 mysql_install_db 初始化)。

24. 列的字符串类型可以是什么#

CHARVARCHARTEXTBLOBENUMSET 等。


SQL 与索引#

25. 发布系统一天五万条增量,运维三年怎么优化#

  1. 表结构合理,适度冗余,减少大 JOIN
  2. 合适类型与引擎 + 索引
  3. 读写分离
  4. 分表降低单表数据量
  5. 缓存(Redis 等)
  6. 静态化不常变页面
  7. 高效 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 语言包括哪几部分#

  • DDLCREATEALTERDROP
  • DMLSELECTINSERTUPDATEDELETE
  • DCLGRANTREVOKE
  • DQL:查询(常归入 DML)

40. 完整性约束包括哪些#

  • 实体完整性:主键唯一
  • 域完整性:类型、范围、NOT NULL
  • 参照完整性:外键一致
  • 用户定义完整性:业务规则

表约束:PRIMARY KEYFOREIGN KEYUNIQUECHECKNOT NULL 等。

文章目录

文章目录