MySQL常见6个考题在实际工作中的运用 - 编程一生

MySQL常见6个考题在实际工作中的运用 - 编程一生

💡 原文中文,约3700字,阅读约需9分钟。
📝

内容提要

文章围绕六个常见MySQL面试题,结合实际工作讲解:MyISAM与InnoDB的区别及历史记录表选用MyISAM的原因;MVCC原理及其在业务乐观锁中的应用;数据库、Redis、ZooKeeper三种分布式锁;B+树索引的优势及采用自增整型主键的原因;覆盖索引如何避免回表;不走索引的常见情况,并介绍慢查询日志、show profile、optimizer trace等优化工具,强调按读写比例合理使用缓存。

🔎

延伸解读

存储引擎选择:InnoDB为主,MyISAM可作历史表补充

文章指出InnoDB支持事务、行级锁,适合数据准确性要求高的场景;MyISAM只支持表级锁,适合查询和插入为主、更新删除很少的场景。实际工作中,作者常用MyISAM存储历史记录表,与InnoDB实时表配合。例如物流状态历史表基本只插入和查询,丢失中间状态不影响当前结果,因此适合MyISAM。这提示读者不必盲目全选InnoDB,可根据表的使用模式做混合设计。

MVCC思想可迁移到业务乐观锁

文章解释MVCC是RC和RR隔离级别下基于乐观锁的实现,通过快照和Read View保证读到已提交事务。作者进一步将MVCC思想用于业务:更新订单状态时,先查询当前状态,再以状态作为更新条件,如update ... where status='未提交',若状态已变则更新失败。这样不依赖数据库事务的MVCC,在业务逻辑中实现了乐观锁,适合状态机控制的场景。

分布式锁选型需权衡组件成本与并发性

文章列出基于数据库、Redis和ZooKeeper三种分布式锁。实际选型时,很多人选Redis,但若系统已引入ZooKeeper且锁用量不大,为减少新组件带来的风险和维护成本,也可能选ZooKeeper。此外,使用Spring事务时,若在事务中执行insert、update或select for update并伴随RPC调用,并发下其他事务会被阻塞,效果类似分布式锁。这提醒读者注意事务边界与锁范围。

索引优化要验证效果,避免盲目加缓存

文章强调使用索引需用工具衡量效果,如慢查询日志、show processlist、show profile和optimizer trace。覆盖索引可通过explain的Extra字段验证,只显示Using index说明未回表。总结部分指出常见误区是无脑在MySQL上层加缓存,但缓存只适用于读多写少场景;金融交易系统读写比例1:1时,缓存反而加重负担。可用show global status like 'Com_______'查看读写比例,再决定是否加缓存。

❓

Q&A

MyISAM和InnoDB存储引擎的主要区别是什么?分别适用于哪些场景?

InnoDB是MySQL默认存储引擎,支持事务、外键、行级锁,适用于对数据一致性要求高的并发场景。MyISAM只支持表级锁,数据按插入顺序排列,适合以查询和插入为主、更新删除很少、对事务完整性要求不高的场景。实际工作中常用MyISAM存储历史记录表,与InnoDB实时表配合使用。

MySQL的MVCC是怎么实现的?在业务中如何应用MVCC思想?

MVCC是基于乐观锁的多版本并发控制,用于读已提交和可重复读隔离级别。它在新事务开启时给每行记录添加事务ID和回滚指针,并通过Read View保存活跃事务列表,确保只读到已提交的数据。业务中可用状态字段实现乐观锁,例如更新订单状态时带上原状态条件,若状态已变则更新失败。

分布式锁有哪几种实现方式?各自有什么特点?

主流实现有三种:基于数据库(主键插入或排他锁)、基于缓存如Redis的setNX、基于ZooKeeper。基于数据库实现简单但并发性有限;Redis性能好但需考虑锁释放;ZooKeeper并发性稍差但可靠性高。实际选型需权衡组件引入成本和维护风险。

为什么MySQL索引使用B+树而不是其他数据结构?

B+树非叶子节点只存索引不存数据,可容纳更多索引;叶子节点包含所有索引字段并用指针链接,提高范围查询性能。相比Hash表范围查询需全表扫描,二叉查找树可能退化为链表,平衡二叉树旋转效率低,红黑树树高IO多,普通B树节点存数据导致一页存储索引少且范围查询需多次IO。

什么是覆盖索引?如何验证查询使用了覆盖索引?

覆盖索引指只需在一棵辅助索引树上就能获取SQL所需的所有列数据,无需回表。可通过explain执行计划查看extra字段,若只显示Using index则使用了覆盖索引;若extra为空或包含filesort则触发了回表。实际开发中应尽量使用覆盖索引以提升查询速度。

哪些情况下查询不会走索引?如何分析慢查询?

不走索引的常见情况包括:不满足最左匹配原则、查询条件使用函数、or操作有字段无索引、like以%开头;对null值多的字段判断、区分度小的字段;需要回表的查询结果集过大。分析慢查询可使用慢查询日志、show processlist、show profile和optimizer trace等工具。

🏷️

标签

➡️

继续阅读