[特殊字符]MySQL面试必问的10个基础问题(附详细解析)

1. 事务的ACID特性怎么理解?(必考题)

先给标准答案:

  • 原子性(Atomicity):事务里的操作要么全成功,要么全失败
  • 一致性(Consistency):数据在事务前后保持合法状态
  • 隔离性(Isolation):多个并发事务互不干扰
  • 持久性(Durability):事务提交后修改永久保存

但面试官最想听的是你的理解!!!举个转账例子:
A给B转账500元,这个事务包含两个操作:

  1. A账户-500
  2. B账户+500

如果只执行了第一步就宕机,这时候原子性就保证了两个操作要么都执行,要么都不执行(数据库会通过undo log回滚)。一致性则确保转账后总金额不变,不会出现A-500但B没+500的情况。

2. 索引底层原理(B+树必须掌握)

很多同学只知道索引能加快查询,但说不清原理(这就很危险了)。MySQL默认使用B+树索引,它有这些特点:

  • 非叶子节点只存键值,叶子节点存储完整数据(InnoDB)
  • 叶子节点用双向链表连接,适合范围查询
  • 树的高度通常3-4层,千万级数据也只要3次IO

(画重点)为什么不用二叉树?
因为二叉树可能退化成链表,而B+树每个节点可以有多个子节点,有效控制树高。实测对比:100万数据B+树高度3层,二叉树可能高达20层!

3. 事务隔离级别与问题

这个知识点很多人背了又忘,我教你用场景记忆法:

隔离级别脏读不可重复读幻读
读未提交✔️✔️✔️
读已提交✖️✔️✔️
可重复读✖️✖️✔️
串行化✖️✖️✖️

举个幻读例子:事务A查询age>18的记录得到2条,这时事务B插入1条age=20的记录并提交。事务A再次查询得到3条,就像出现幻觉一样!

4. 聚簇索引 vs 非聚簇索引

(超级重要区别)
聚簇索引:

  • 叶子节点存整行数据
  • 每个表只能有一个
  • 主键索引就是聚簇索引

非聚簇索引:

  • 叶子节点存主键值
  • 需要回表查询
  • 可以创建多个

举个查询场景:

SELECT * FROM users WHERE name = '张三';

如果name字段有非聚簇索引,查询过程是:

  1. 在name索引树找到’张三’对应的主键id
  2. 用主键id去聚簇索引树取整行数据

5. 行锁、表锁、间隙锁

锁机制是保证并发安全的关键:

  • 行锁:锁定某一行,InnoDB默认锁粒度
  • 表锁:MyISAM默认,锁整个表
  • 间隙锁:锁定索引记录之间的间隙(解决幻读)

特别注意:
UPDATE语句如果没有走索引会升级为表锁!!!
比如执行:

UPDATE users SET age=20 WHERE name='李四';

如果name字段没索引,就会锁整个表,千万要注意!

6. 三大日志:undo log、redo log、binlog

(日志体系是MySQL的精华)

  • undo log:用于事务回滚,记录数据修改前的值
  • redo log:保证持久性,记录物理修改
  • binlog:主从复制使用,记录逻辑操作

更新语句执行流程:

  1. 从磁盘加载数据到内存
  2. 写undo log
  3. 修改内存中的数据
  4. 写redo log(prepare状态)
  5. 写binlog
  6. 提交事务,redo log改为commit状态

7. JOIN的七种用法

实际开发最常用的三种:

  1. INNER JOIN:取交集
  2. LEFT JOIN:左表全保留
  3. RIGHT JOIN:右表全保留

(易错点)ON和WHERE的区别:

  • ON是连接条件,在JOIN时过滤
  • WHERE是在连接后过滤

示例:

SELECT * 
FROM A LEFT JOIN B 
ON A.id = B.a_id 
WHERE B.status = 1; -- 这会过滤掉B表为null的记录

8. SQL优化实战技巧

分享几个立竿见影的优化技巧:

  1. 避免SELECT *,只取需要的字段
  2. 用EXISTS代替IN(当子查询结果集大时)
  3. 分页查询优化:
    常规写法:
    SELECT * FROM table LIMIT 1000000,10; -- 慢
    
    优化方案:
    SELECT * FROM table WHERE id > 1000000 LIMIT 10;
    

9. 主从复制原理

(面试高频考点)
主从复制三步走:

  1. Master将数据变更写入binlog
  2. Slave的IO线程读取Master的binlog
  3. Slave的SQL线程重放binlog

配置主从的坑点总结:

  • server-id必须唯一
  • 从库需要设置read_only
  • 注意binlog格式(推荐row格式)
  • 主从时间要同步

10. Explain执行计划详解

学会看Explain输出是调优的基本功,核心字段:

  • type:访问类型(最好到ref,避免ALL)
  • key:实际使用的索引
  • rows:预估扫描行数
  • Extra:额外信息(Using filesort要警惕)

示例分析:

EXPLAIN SELECT * FROM users WHERE age > 18 ORDER BY name;

如果Extra出现"Using filesort",说明需要优化排序,可以创建(age,name)的复合索引。

🚀最后的小建议

MySQL的知识点看似零散,但其实都是围绕两个核心展开:

  1. 如何保证数据安全(ACID、锁、日志)
  2. 如何提高查询性能(索引、执行计划、架构设计)

建议准备面试时,每个知识点都自己动手实践一遍。比如配置主从复制,虽然现在云数据库很方便,但自己搭建一次能理解很多原理性问题。遇到问题时善用官方文档(MySQL :: MySQL 8.0 Reference Manual),比搜索引擎更可靠!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值