首页 / 资讯中心 / 文章详情

MySQL 社招面试高频 20 问:索引、事务、锁、慢查询优化,附追问思路

MySQL 社招面试高频 20 问:索引、事务、锁、慢查询优化,附追问思路 ★ FEATURED ARTICLE
本文整理社招后端面试中 MySQLInnoDB的高频问题。细节以 MySQL 官方文档为准不同版本行为可能不同回答时说清你用的版本如 5.7 / 8.0。一、索引6 问1. InnoDB 为什么用 B 树做索引B 树非叶子节点只存键和指针单个节点能放更多键树更矮查询磁盘 IO 次数少数据都在叶子节点且叶子之间有链表范围查询和排序友好。追问为什么不用哈希——哈希只适合等值查询不支持范围和排序为什么不用红黑树——树太高IO 次数多。2. 聚簇索引和二级索引有什么区别InnoDB 的主键索引是聚簇索引叶子节点存整行数据二级索引叶子节点存的是主键值查到后还要回主键索引取整行这一步叫回表。追问没有主键会怎样——InnoDB 会选第一个非空唯一索引没有就生成隐藏的行 ID。3. 什么是覆盖索引查询需要的列都在索引里不用回表就能返回结果。比如在 (name, age) 上建索引select age from t where name ?就是覆盖索引。追问怎么看是否用了覆盖索引——EXPLAIN的 Extra 里出现Using index。4. 最左前缀原则是什么联合索引 (a, b, c) 按 a、b、c 的顺序排序查询条件要从最左列开始连续匹配才能充分用上索引遇到范围查询后面的列一般用不上索引排序。追问where b 1 and a 2能用上吗——能优化器会调整条件顺序关键是有没有用到最左列。5. 哪些情况会导致索引失效对索引列做函数或运算、隐式类型转换字符串列用数字比较、like %xx左模糊、or两边不都有索引、不满足最左前缀、优化器判断全表扫描更快。追问怎么确认——用EXPLAIN看 type、key、rows。6. 索引是不是越多越好不是。索引占空间写入时要维护所有索引影响插入和更新性能。区分度低的列如性别单独建索引意义不大。追问怎么判断该不该建——看查询频率、区分度和写入压力结合慢查询日志。二、事务与 MVCC4 问7. 事务的 ACID 分别靠什么保证原子性靠 undo log 回滚持久性靠 redo log隔离性靠锁和 MVCC一致性是目标由前三者和应用层约束共同保证。8. 四种隔离级别分别解决什么问题读未提交可能脏读读已提交解决脏读可能不可重复读可重复读InnoDB 默认解决不可重复读串行化全部加锁性能最差。追问可重复读能防止幻读吗——快照读通过 MVCC 避免当前读通过间隙锁 / 临键锁避免大部分幻读场景。9. MVCC 是怎么实现的每行有隐藏的事务 ID 和回滚指针旧版本通过 undo log 串成版本链读操作生成 Read View按可见性规则沿版本链找到对当前事务可见的版本。追问读已提交和可重复读的区别——前者每次读都生成新的 Read View后者在事务第一次读时生成并复用。10. 长事务有什么问题占用锁时间长容易引发锁等待undo log 无法清理版本链变长影响查询性能和存储空间。追问怎么发现——查information_schema.innodb_trx里运行时间长的事务。三、锁4 问11. InnoDB 有哪些锁按粒度表锁、行锁行锁里有记录锁、间隙锁、临键锁记录锁 间隙锁还有意向锁用于表锁和行锁的协调。按模式共享锁、排他锁。12. 行锁锁的是什么锁的是索引记录。如果查询条件没有走索引可能会扫描并锁住大量记录效果接近锁表。追问所以更新语句要注意什么——条件列要有合适的索引。13. 死锁是怎么产生的怎么处理两个事务互相等待对方持有的锁。InnoDB 会检测到死锁并回滚其中一个代价较小的事务。追问怎么避免——按固定顺序访问资源、缩短事务、合理使用索引减少加锁范围排查用show engine innodb status看最近一次死锁信息。14. 乐观锁和悲观锁怎么选悲观锁用select ... for update先加锁乐观锁用版本号或条件更新冲突时重试。冲突少、读多写少用乐观锁冲突多、必须强一致用悲观锁。四、日志与主从3 问15. redo log、undo log、binlog 分别是干什么的redo logInnoDB 的物理日志保证崩溃后已提交事务不丢undo log记录修改前的数据用于回滚和 MVCCbinlogServer 层的逻辑日志用于主从复制和按时间点恢复。16. 为什么要两阶段提交保证 redo log 和 binlog 的一致先写 redo logprepare再写 binlog最后提交 redo logcommit。崩溃恢复时根据两者状态决定提交还是回滚避免主从数据不一致。17. 主从复制的流程主从延迟怎么处理主库写 binlog从库 IO 线程拉取写入 relay logSQL 线程回放。延迟处理从库并行复制、避免大事务、关键读走主库、业务上容忍短暂不一致。五、慢查询优化3 问18. 怎么排查一条慢 SQL开慢查询日志定位 SQL →EXPLAIN看执行计划type、key、rows、Extra→ 检查索引和写法 → 必要时用EXPLAIN ANALYZE8.0看实际执行情况。追问type 从好到差——system、const、eq_ref、ref、range、index、ALL。19. 深分页怎么优化limit 1000000, 10要扫描并丢弃前面大量行。可以用「记住上一页最后一条的主键下一页where id ?」的方式或者先用覆盖索引查出主键再关联取数据。20. 大表怎么加字段、怎么拆分加字段8.0 部分 DDL 支持 Instant其余用 Online DDL 或第三方工具拆分先考虑归档历史数据再考虑按业务键分库分表同时要设计好全局 ID、跨分片查询和数据迁移方案。怎么用这份清单准备每道题先用自己的话讲一遍再对照要点补漏结合项目准备例子比如「我们的订单表做过一次深分页优化接口耗时从 x 降到 y」找人按「追问」部分往下问两层练到不卡壳没在生产环境用过的特性直接说明再讲你理解的原理比硬编更加分。—— OfferGod 面神求职助手 整理
阅读完成 · 觉得有帮助?
咨询建站