首页 归档 关于 learn love 工具

MySQL的体系结构

整体架构

mysql架构
从Mysql官网提供的体系结构图中可以看出来出来,整个mysql分为以下几部分

  1. MyISAM不支持事务(不支持ACID),InnoDB支持事务(支持ACID)
  2. 使用DML语句时,MyISAM锁级别是表锁,同一时间只支持一个session修改表,而InnoDB是行锁,粒度更细,并发更高
  3. MyISAM不支持外键,InnoDB支持
  4. MyISAM写入速度慢,查询速度快,InnoDB写入快,查询慢(相对)
  5. InnoDB因为支持事务,所以更可靠,MyISAM无法保证数据完整性
  6. MyISAM只存储索引,不缓存数据,支持全文索引,InnoDB缓存索引以及数据,不支持全文索引(5.6之前)

所以在选择哪个引擎的时候要根据实际业务选择,比如某个业务只会插入一次数据,后面的都只有查询,那么我就建议使用MyISAM,如果需要支持事务那就用InnoDB。

InnoDB引擎

由于我们平时使用多的还是InnoDB引擎,所以这里主要剖析下InnoDB的存储结构(MyISAM和InnoDB在存储结构上是类似的)

5.7和8.0有些许不一致,主要是系统表空间的一些内容会移动到单独的表空间中去

为了保证数据不丢失,我们的数据必须要落盘,但是如果每次增删改查都去操作磁盘,那效率太低了,所以mysql会在内存中抽象出一份数据结构和磁盘一一对应,这样我们每次的增删改查就会优先操作内存中的数据。

咱们插入的数据是存储在磁盘的,而平时我们通过Navicate或者shell查询出来的数据,展现形式为表格,并不代表我们的数据也是这样直接这样存储在磁盘上的,磁盘上的数据有自己的格式。

比如我们将数据存在在文件是这样存储的

user.id=1
user.name=think123
user.age=18

内存结构

将内存中数据刷新到磁盘并不是一条数据一条数据从内存刷新到磁盘的,为了效率,InnoDB将数据划分为若干个页,以页作为磁盘和内存之间交互的基本单位,InnoDB中页的⼤⼩⼀般为 16KB,和磁盘上默认的页大小一致。

也就是在⼀般情况下,⼀次少从磁盘中读取16KB的内容到内存中,⼀次少把内存中的16KB内容刷新到磁盘中。

而内存数据结构主要分为 Buffer Pool(缓冲池) 和 Log Buffer(日志缓冲),它们管理的都是页,而页中存储的是数据。

原文

https://z.itpub.net/article/detail/3E097E5138AA4A892D4BA75704C34B07