本文共 1574 字,大约阅读时间需要 5 分钟。
MySQL 基本架构
MySQL 的基本架构分为两大层:Server 层和存储引擎层。Server 层主要负责处理连接、查询、分析、优化和执行等功能,包含连接器、查询缓存、分析器、优化器和执行器等模块。存储引擎层则负责数据的存储和读取,支持 MyISAM、InnoDB 等存储引擎,其中 InnoDB 提供了 redo log 日志模块。
SQL 语句执行流程
在处理 SQL 语句时,查询语句的执行流程包括权限校验、查询缓存、分析器、优化器、权限校验、执行器和存储引擎等环节。更新语句则需要经过分析器、权限校验、执行器和存储引擎的处理,涉及到写 undo log、存储事务 ID 和回滚指针等操作。
MySQL 存储引擎
MySQL 提供了两种主要存储引擎:MyISAM 和 InnoDB。MyISAM 是 5.5 版本之前的默认存储引擎,支持表级锁但不支持事务和外键。InnoDB 是 5.5 版本以来的默认存储引擎,支持行级锁、事务、外键和 MVCC,且具备崩溃修复能力。
事务四大特性(ACID)
ACID 包括原子性、一致性、隔离性和持久性。原子性确保事务要么全部成功要么全部失败。一致性保证事务执行前后数据保持一致。隔离性防止并发事务干扰,持久性确保提交后数据改变持久化。
如何保证 ACID
ACID 的实现依赖于 undo log、锁机制和 MVCC 等技术。undo log 记录事务的回滚日志,锁机制防止并发修改,一致性通过版本控制和读视图实现。
并发事务的问题
并发事务可能导致脏读、丢失更新、不可重复读和幻读等问题。这些问题需要通过事务控制和锁机制来避免。
四个隔离级别
MySQL 提供四种隔离级别:读取未提交、读取已提交、可重复读和串行化。每个隔离级别对应不同的并发控制机制和锁粒度。
MVCC
MVCC 是 InnoDB 用于实现并发控制的技术,通过版本链和读视图来解决读写冲突。版本链记录数据的历史版本,读视图用于判断哪些版本是当前事务可见的。
当前读和快照读
当前读读取最新版本的数据并加锁,快照读读取可见版本的数据,不加锁。快照读基于 MVCC 实现,适用于可重复读和串行化隔离级别。
索引
索引分为哈希索引和 BTree 索引。MySQL 使用 B+Tree 索引,其中 InnoDB 的索引是聚簇索引,数据文件和索引文件是同一结构。
MyISAM 和 InnoDB 对 B+Tree 索引的实现
MyISAM 的索引是非聚簇索引,主索引和辅助索引分别对应数据记录和数据文件。InnoDB 的索引是聚簇索引,数据文件本身就是索引文件。
覆盖索引
覆盖索引是一种联合索引,能够同时包含查询的所有字段,允许直接通过索引获取结果。
锁类型
锁类型包括共享锁和排他锁。共享锁允许其他事务读取,排他锁则阻止其他事务读取和修改。锁粒度分为表锁和行锁,InnoDB 支持乐观锁和悲观锁。
InnoDB 的三种锁算法
InnoDB 使用 Record lock、Gap lock 和 Next-key lock 三种锁算法来实现行锁。Next-key lock 除了锁定记录本身,還锁定其前一个记录,避免幻读。
关于 MySQL 的锁
InnoDB 的默认隔离级别是可重复读,使用 MVCC 和锁机制来避免并发问题。加锁读使用 Next-key lock 锁算法,避免幻读。
大表优化
大表优化包括限定数据范围、读写分离、垂直拆分、水平拆分和分库。这些方法能够提高查询效率和系统性能。
分库分表后如何保证 ID 唯一性
在分库分表后,可以采用 UUID、自增 ID、Redis 生成 ID 或分布式 ID 算法来保证 ID 唯一性。
Reference
本文参考了《高性能 MySQL》等权威资料,内容基于实际经验和技术文档。
转载地址:http://qger.baihongyu.com/