MySQL架构
MySQL架构
MySQL整体架构
MySQL整体架构大体分为两层——Server层和执行引擎层。
Server层负责建立连接,SQL的分析、分析和执行SQL。
执行引擎层负责存储和提取数据。
从一条select语句来看各个结构作用、如何配合工作:
- 连接器先建立连接。(比如使用
mysql -uroot -pxxxyyy与数据库建立连接),连接器负责与客户端建立连接。 - 查询缓存,这里查询的是Server层中的缓存,如果之前有一模一样的SQL语句则直接返回结果(但是在Server层的缓存很鸡肋,必须要SQL语句完全一致,命中率很低,后续MySQL版本中移除了,而且在执行引擎层也有缓存,那个缓存命中率更高)
- 解析器解析SQL语句,也就是词法分析、语法分析。
- 然后是执行SQL,具体还可以细分步骤如下:
- 预处理器大概判断该sql能否成功执行(比如检查要查询的表有没有)
- 优化器指定执行计划(有哪些索引可用、具体使用哪个索引、是否有索引覆盖、索引下推等)
- 执行器执行sql(也就是从执行引擎调用api查询数据)
后起之秀:InnoDB存储引擎
相比于MyISAM,InnoDB是现在用的最多的存储引擎。
- 它支持事务
- 有redo-log保证事务的持久性,undo-log支持事务的原子性。
- MyISAM没有这两个日志,所以多条语句的回滚做不到(无undo-log)
- 有更小的锁粒度(行级锁)(也就有更高的并发度)
- 而MyISAM只支持表锁。
- 使用聚簇索引(数据和索引存储在一起)存储数据
- 而MyISAM引擎的表数据和索引数据分开存储,不支持聚簇索引。
这些特性说明了InnoDB在并发场景下具有更好的读写性能。
InnoDB行数据如何存储
首先表空间结构层次为:表-段-区-页-行。
总之知道数据行是存储在页中就行,默认每个页大小16KB,是B+树中的数据存储基本单位,也是数据从内存刷到硬盘的基本单位(页)(为了减少IO次数)。当数据量变大时,B+树中存的会从页变成区。
InnoDB行格式(算了不想写,记不起来了,估计以后也会忘,丢几篇博客在下面:)








