社区首页 >专栏 >这些常见的mysql八股,你能答出来多少? 了解过ACID事务特性实现吗?
- 原子性(Atomicity)
通过 Undo Log(回滚日志) 保证,确保事务出错时可以回滚到初始状态。
- 一致性(Consistency)
依赖于持久性、原子性和隔离性,确保事务执行前后数据库状态符合约束规则。
- 隔离性(Isolation)
通过 MVCC(多版本并发控制) 或锁机制保证,避免并发事务之间相互干扰。
- 持久性(Durability)
通过 Redo Log(重做日志) 保证,确保事务提交后数据不会丢失。
MySQL事务隔离级别了解过吗?
- 从低到高依次为:
读未提交(RU)→ 读已提交(RC)→ 可重复读(RR)→ 串行化(Serializable)
- 默认隔离级别是 可重复读(RR)
- 幻读问题解决:
- 可重复读通过MVCC实现快照读,避免大部分幻读;并通过间隙锁防止当前读的幻读。
- 串行化隔离级别彻底解决幻读,采用共享锁,避免MVCC。
- 业务选择RC而非RR的原因?:
幻读影响较小,且RC性能优于RR,适合对性能要求高且幻读可接受的场景。
- 可重复读下MVCC实现及幻读:
事务启动时生成一个ReadView,保证事务内读到一致的快照版本;
但某些特殊情况如事务修改不可见版本或快照读结合当前读,仍可能出现少量幻读。
介绍一下MySQL各种锁的及作用
- 设计多种锁机制,保障并发控制和数据一致性,避免脏读、不可重复读、幻读等。
- 全局锁
用于数据库级操作,如备份时阻止写操作,保证数据一致性,影响范围大,需谨慎使用。
- 表级锁
- MyISAM仅支持表级锁,粒度大并发写性能差。
- InnoDB支持行锁,但也有元数据锁(MDL)保证DDL和DML的互斥。
- 元数据锁(MDL)
保证DDL(如ALTER TABLE)与DML操作的互斥,防止结构变更冲突。
- 意向锁(Intention Lock)
表级锁,用于告诉上层锁管理器表中哪些行被锁,分意向共享锁(IS)和意向排它锁(IX),提高检测效率。
- 行级锁
InnoDB的核心锁机制,粒度最细,支持高并发,包含:
- 记录锁(Record Lock)
- 间隙锁(Gap Lock)
- 临键锁(Next-Key Lock,记录锁+间隙锁组合,防幻读)
MySQL常见索引类型有哪些?
- 普通索引(非唯一)
- 唯一索引(保证列值唯一)
- 主键索引(不允许NULL,InnoDB中为聚簇索引)
- 全文索引(适合文本关键词搜索)
- 组合索引(多列联合索引)
MySQL索引底层数据结构为何采用B+树?
- 适合磁盘存储,节点容量大、树高度低,减少磁盘IO。
- 非叶子节点只存索引,查询更高效。
- 所有数据存储在叶子节点,且通过双向链表连接,支持高效范围查询和顺序扫描。
- B+树结构稳定,插入删除对树结构影响较小。
覆盖索引(Covering Index)了解过吗?
- 二级索引中包含查询所需的所有字段,查询时无需回表,提高效率。
最左匹配原则是什么?
- 联合索引只能利用最左边连续的索引列。
- 例如索引
(a,b,c),查询条件包含 a 或 a,b 或 a,b,c 可用索引;仅使用 b,c 无法利用该索引。
索引失效场景有哪些?(口诀:“模型数空运最快”)
- 模:模糊匹配
% 在前面,如 %xx、%xx%
- 型:类型转换导致隐式转换,如字符串和数字比较
- 数:列上使用函数或表达式
- 空:索引列允许
NULL 导致失效
- 运:表达式计算导致失效
- 最:未遵守最左匹配原则
- 快:全表扫描比走索引快
讲一下索引下推(Index Condition Pushdown,ICP)
- 联合索引查询时,将部分过滤条件从服务层提前下推到存储引擎层。
- 存储引擎在回表前或回表时过滤不满足条件的记录,减少回表次数和数据传输,提升查询性能。
- ICP不能完全避免回表,但能优化回表后的过滤过程。
EXPLAIN关键字用过吗?
- 查看SQL执行计划,帮助分析访问路径、索引使用、扫描行数和连接顺序等。
常用字段:
-
id:查询序号
-
select_type:查询类型
-
table:访问表
-
type:访问类型,优先级 const、eq_ref,避免 ALL(全表扫描)
-
possible_keys:可能使用的索引
-
key:实际使用的索引
-
key_len:使用索引长度
-
ref:列或常量用于查找索引
-
rows:估算扫描行数
-
Extra:额外信息,如覆盖索引(Using index)、索引下推(Using index condition)、临时表(Using temporary)
慢查询日志是什么?
- 记录执行时间超过阈值的慢SQL,帮助发现性能瓶颈。
- 通过分析慢查询日志定位慢SQL后,配合
EXPLAIN 查看执行计划,定位问题根源,指导优化。
MySQL三大日志了解多少?
服务器层面三大日志
- 错误日志(Error Log):记录MySQL启动、关闭和运行时错误。
- 慢查询日志(Slow Query Log):记录慢SQL。
- 二进制日志(Binary Log,binlog):记录所有数据变更,用于复制和恢复。
InnoDB存储引擎三大日志
- 重做日志(Redo Log):保证事务持久性,用于崩溃恢复。
- 回滚日志(Undo Log):支持事务回滚和MVCC。
- 二进制日志(Binary Log):记录最终数据变更,用于复制和恢复。
本文参与
腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-08-11,如有侵权请联系
cloudcommunity@tencent.com 删除