前言:

MYSQL中常见的三种存储引擎有:MyISAM引擎、InnoDB引擎、Memory引擎。

MyISAM引擎

MyISAM引擎是MySQL默认的存储引擎,MyISAM不支持事务和行级锁,所以MyISAM引擎速度很快,性能优秀。MyISAM可以对整张表加锁,支持并发插入,支持全文索引。如果你不需要事务支持,通常我们建表时都选用MyISAM存储引擎,像新闻表之类都没有必要支持事务。

InnoDB引擎

InnoDB是专门为事务设计的存储引擎,支持事务,支持外键,拥有高并发处理能力。但是,InnoDB在创建索引和加载数据时i,比MyISAM慢。涉及到货币操作一般都需要支持事务。

Memory引擎

该引擎采用哈希索引。内存表,Memory引擎将数据存储在内存中,表结构不是存储在内存中,查询时不需要执行磁盘I/O操作,所以要比MyISAM和InnoDB快很多倍,但是数据库断电或是重启后,表中的数据将会丢失,表结构不会丢失。如果、需要将SESSION数据存在数据库中,那么使用Memory引擎就可以。

1 InnoDB的存储结构

mysql内存表单元测试 mysql内存引擎_数据库

1.1 内存池

(1) 维护所有进程/线程需要访问的多个内部数据结构。

(2) 缓存磁盘上的数据,方便快速的读取,同时在对磁盘文件的数据修改之前在这里缓存。

(3) 重做日志缓冲等。

1.2 InnoDB存储引擎中内存的结构情况(内存数据情况)

mysql内存表单元测试 mysql内存引擎_数据库_02

1.2.1 缓冲池

它是一块内存区域。在数据库中进行读取页的操作,首先将从磁盘读到的页存放在缓冲池中,下一次读取相同的页时,首先判断该页是不是在缓冲池中,若在,称该页在缓冲池中被命中,直接读取该页。否则,读取磁盘上的页。对于数据库中页的修改操作,首先修改在缓冲池中页,然后再以一定的频率刷新到磁盘,并不是每次页发生改变就刷新回磁盘。

1.2.2 重做缓冲日志

将重做日志信息先放到这个缓冲区,然后再刷新回日志文件。重做日志文件一般不需要设置得很大。

1.2.3 额外内存缓冲池

在 InnoDB存储引擎中,对一些数据结构本身的内存进行分配时需要从额外的内存池中进行申请。例如,分配了缓冲池,但是每个缓冲池中的帧缓冲还有对应的缓冲控制对象,这些对象记录以一些诸如 LRU(最近最久未使用)、锁、等待等信息,而这个对象的内存需要从额外的内存池中申请。

2 InnoDB的关键特性

2.1 insert buffer

操纵对象:辅助索引页,通过B+树组织的物理页,对于非聚集索引的插入或者更新操作(因为聚集索引是按主键递增的顺序进行插入的,所以对于聚集索引不需要Insert Buffer 可以直接进行顺序读取),不是每次直接插入到索引页中的,而是判断插入的非聚集索引页是否在缓冲池中,若在,则直接插入,否则,先放在Insert Buffer 对象中,就像是已经插入到已经插入到索引的叶子节点,而实际并没有,只是存放在另一个位置,然后再以一定的频率和情况进行Insert Buffer(B+树)和辅助索引叶子节点的Merge*(合并)(合并的时机在下面讲解)操作,这时,通常能将多个插入合并到一个操作中(因为在一个索引页中),这样就极大地提高了非聚集索引的插入性能。

2.1.1 Insert Buffer的使用需要同时满足以下两种情况

(1) 索引是辅助索引。

(2) 索引不是唯一的(数据库并不去查找索引页来判断插入记录的唯一性,如果去查找肯定又会有离散读取的情况发生)。

2.2 double write

在对缓冲池的脏数据进行刷新时,并不直接写磁盘,而是会通过memcpy函数将脏页先复制到内存的doublewriter buffer ,然后通过doublewriter Buffer分两次,每次1MB 顺序的写入共享表空间的物理磁盘上。然后马上调用fsync函数,同步到磁盘(从内存到数据文件)。在完成doublewrite 页的写入后,再将doublewrite Buffer 中的页写入各个表空间文件中。如果系统在将页写入磁盘的过程中发生崩溃,在恢复过程中,InnoDB 存储引擎可以从共享表空间中的doublewrite中找到该页的副本,将其复制到表空间文件,再应用重做日志。