MySQL架构

MySQL整体架构

MySQL整体架构大体分为两层——Server层和执行引擎层。

Server层负责建立连接,SQL的分析、分析和执行SQL。

执行引擎层负责存储和提取数据。

从一条select语句来看各个结构作用、如何配合工作

  1. 连接器先建立连接。(比如使用mysql -uroot -pxxxyyy与数据库建立连接),连接器负责与客户端建立连接。
  2. 查询缓存,这里查询的是Server层中的缓存,如果之前有一模一样的SQL语句则直接返回结果(但是在Server层的缓存很鸡肋,必须要SQL语句完全一致,命中率很低,后续MySQL版本中移除了,而且在执行引擎层也有缓存,那个缓存命中率更高)
  3. 解析器解析SQL语句,也就是词法分析、语法分析。
  4. 然后是执行SQL,具体还可以细分步骤如下:
    • 预处理器大概判断该sql能否成功执行(比如检查要查询的表有没有)
    • 优化器指定执行计划(有哪些索引可用、具体使用哪个索引、是否有索引覆盖、索引下推等)
    • 执行器执行sql(也就是从执行引擎调用api查询数据)

后起之秀:InnoDB存储引擎

相比于MyISAM,InnoDB是现在用的最多的存储引擎。

  • 它支持事务
    • 有redo-log保证事务的持久性,undo-log支持事务的原子性。
    • MyISAM没有这两个日志,所以多条语句的回滚做不到(无undo-log)
  • 有更小的锁粒度(行级锁)(也就有更高的并发度)
    • 而MyISAM只支持表锁。
  • 使用聚簇索引(数据和索引存储在一起)存储数据
    • 而MyISAM引擎的表数据和索引数据分开存储,不支持聚簇索引。

这些特性说明了InnoDB在并发场景下具有更好的读写性能。

InnoDB行数据如何存储

首先表空间结构层次为:表-段-区-页-行。

总之知道数据行是存储在页中就行,默认每个页大小16KB,是B+树中的数据存储基本单位,也是数据从内存刷到硬盘的基本单位(页)(为了减少IO次数)。当数据量变大时,B+树中存的会从页变成区。

InnoDB行格式(算了不想写,记不起来了,估计以后也会忘,丢几篇博客在下面:)

04-从一条记录说起-InnoDB记录结构

MySQL一行记录是怎么存储的

InnoDB vs MyISAM