InnoDB 存储引擎体系架构

@[toc] --- ## InnoDB 存储引擎的体系架构 InnoDB 存储引擎由**内存池(Buffer Pool)**和一些**后台线程**组成: <img src="https://cs-wiki.oss-cn-shanghai.aliyuncs.com/img/20210629165703.png" /> - **内存池(Buffer Pool)**:InnoDB 存储引擎是基于磁盘存储的,并将其中的记录按照**页**的方式进行管理。因此可将其视为**基于磁盘的数据库系统**(Disk-base Database),在这样的系统中,众所周知,由于 CPU 速度与磁盘速度之间的不匹配,通常会使用 Cache 来提高数据库的整体性能。所以这里的内存池也被称为缓冲池(简单理解为缓存就好了)。 当 Buffer Pool 中的某页数据被修改后,该页就被标记为 ”脏页“,脏页的数据会被定期刷新到磁盘上(学过操作系统的小伙伴应该已经很熟悉了) - **后台线程**:后台线程其实最大的作用就是用来完成 “将从磁盘读到的页存放在缓冲池中” 以及 “将缓冲池中修改过的数据以一定的频率刷新到磁盘上” 这俩个操作的 ## InnoDB 存储引擎和 MyISAM 存储引擎的区别 **在 MySQL 5.1 及之前的版本,MyISAM 是默认的存储引擎,而在 MySQL 5.5.5 后,InnoDB 成为了默认的存储引擎**。 1. **InnoDB 支持事务**,MyISAM 不支持事务。这是 MySQL 将默认存储引擎从 MyISAM 变成 InnoDB 的重要原因之一; 2. **InnoDB 最小的锁粒度是行锁,MyISAM 最小的锁粒度是表锁**。一个更新语句会锁住整张表,导致其他查询和更新都会被阻塞,因此并发访问受限。这也是 MySQL 将默认存储引擎从 MyISAM 变成 InnoDB 的重要原因之一; 3. **InnoDB 支持外键**,而 MyISAM 不支持。对一个包含外键的 InnoDB 表转为 MYISAM 会失败; 4. **InnoDB 是聚簇索引,MyISAM 是非聚簇索引**。聚簇索引的文件存放在主键索引的叶子节点上,因此 InnoDB 必须要有主键,通过主键索引效率很高。但是辅助索引需要两次查询,先查询到主键,然后再通过主键查询到数据。因此,主键不应该过大,因为主键太大,其他索引也都会很大。而 MyISAM 是非聚集索引,数据文件是分离的,索引保存的是数据文件的指针。 5. InnoDB 不保存表的具体行数,执行 select count(*) from table 时需要全表扫描。而MyISAM 用一个变量保存了整个表的行数,执行上述语句时只需要读出该变量即可,速度很快 **如何选择:** 1. 是否要支持事务,如果要请选择 InnoDB,如果不需要可以考虑 MyISAM 2. **如果表中绝大多数都只是读查询,可以考虑 MyISAM,如果写操作很频繁,请使用 InnoDB** > 为什么 MyISAM 会比 Innodb 的查询速度快? > > INNODB在做 `SELECT` 的时候,要维护的东西比 MYISAM 引擎多很多 > > - 数据块,INNODB要缓存,MYISAM 只缓存索引块, 这中间还有换进换出的减 > - InnoDB 寻址要映射到块,再到行,MYISAM 记录的直接是文件的 OFFSET,定位比 InnoDB 要快 > - InnoDB还需要维护MVCC一致;虽然你的场景没有,但他还是需要去检查和维护 3. 系统奔溃后,MyISAM 恢复起来更困难,能否接受,不能接受就选 InnoDB;