二、InnoDB存储引擎

InnoDB是MySQL默认的事务型引擎。除非有特别原因,否则应该优先考虑InnoDB引擎。

1.InnoDB概览

InnoDB的数据存储在表空间中,表空间由一系列数据文件组成。InnoDB可以将每个表的数据和索引放在单独文件中。

InnoDB采用MVCC来支持高并发,实现了四个标准隔离级别。默认基本是可重复读,并且提供间隙锁(next-key locks)策略防止幻读出现。

InnoDB有三种行锁:

  • Record Locks(记录锁):锁定指定行的索引项
  • Gap Locks:锁定某一范围内索引,但不包括记录本身
  • Next-Key Locks(间隙锁):锁定一个范围内的索引,并锁定记录本身,相当于Record Locks+Gap Locks

InnoDB的表基于聚簇索引建立,聚簇索引对主键查询性能高。二级索引(secondary index,非主键索引)中必须包含主键列,所以如果主键列很大,其他索引都会很大。因此,若表上的索引较多,主键应当尽量小。

2.InnoDB体系架构


二、InnoDB存储引擎_第1张图片
InnoDB存储引擎体系架构

后台线程主要作用是负责刷新内存池中的数据,保证缓冲池中的内存缓存是最近的数据。此外将已修改的数据刷新到磁盘文件,同时保证数据库异常时InnoDB能够恢复到正常状态。

①后台线程

1.Master Thread

核心后台线程,主要负责将缓冲池中数据异步刷新到磁盘,保证数据一致性。

2.IO Thread

在InnoDB中大量使用了AIO(Async IO)处理IO请求,这样极大提高数据库性能。IO Thread主要负责IO请求的回调处理。

从InnoDB 1.0x版本开始,read thread和write thread分别增大到4个,不再使用innodb_file_io_threads参数,而是分别使用innodb_read_io_threads和innodb_write_io_threads参数设置。

show variables like 'innodb_%io_threads'\G;

可通过show engine innodb status观察InnoDB的IO Thread:

show engine innodb status\G;

3.Purge Thread

事务被提交后,其实所使用的undolog可能不再需要,因此需要PurgeThread回收以使用并分配的undo页。
从InnoDB 1.1版本开始,purge存在可以独立到单独线程进行。在MySQL数据库配置文件中添加如下命令来启用PurgeThread:

innodb_purge_threads=1

从InnoDB 1.2版本开始,InnoDB支持多个PurgeThread,目的是为了加快undo页回收。同时,由于PurgeThread需要离散读取undo页,这样利用了磁盘的随机读取性能。
用户设置PurgeThread:

select version\G;
...
show variables like 'innodb_purge_threads'\G;
...

4.Page Cleaner Thread

在InnoDB 1.2.x版本引入,作用是将之前版本中脏页的刷新操作都放入单独线程中完成,目的是减轻原Master Thread工作及对于用户查询线程的阻塞。

你可能感兴趣的:(二、InnoDB存储引擎)