从MySQL5.5版本开始默认使用InnoDB作为引擎,它擅长处理事务,具有自动奔溃恢复的特性,在日常开发中使用非常广泛。

  InnoDB主要用于事务处理应用系统,主要面向OLTP方面;其特点是行锁设置,即非锁定度——默认情况下度不产生锁。其高并发通过多版本并发控制获,同时实现了ANS标准的四种隔离级别(可参加MySQL事务之隔离级别 - 池塘里洗澡的鸭子 - 博客园 (cnblogs.com))——其中默认级别为Repeatable。

  InnoDB将数据放在一个逻辑表空间中。其类型的表只有ibd文件,分为数据区和索引区(具有较好的读/写并发能力)。物理文件有日志文件、数据文件和索引文件,其中索引文件和数据文件放在一个目录下可以设置共享文件和独享文件两种格式。

    1、共享表空间存储:

      这种方式创建的表结构保存在.frm的文件中。所有的数据和索引保存在一个单独的表空间(由参数innodb_data_home_dir和innodb_data_file_path定义。若innodb_data_home_dir为空则默认存放在datadir下,初始大小为10MB),而这个表空间可以由很多个文件组成,一个表可以跨多个文件存在。所以其大小限制不再是问大小的限制而是其自身的限制。

      show variables like '%innodb_data%';

        

mysql innodb 多文件存储 mysql innodb文件结构_数据文件

    2、独立表空间(多表空间)存储:这种方式创建的表结构仍然保存在.frm文件中,只是每个表的数据和索引单独保存在.ibd中。如果是一个分区表,那么每一个分区对应单独的.ibd文件,文件名是“表名+分区名”。可以在创建分区时指定每个分区的数据文件的位置,以此将表的I/O均匀分布在多个磁盘上。

      若要使用独立表空间的存储方式,那么需要设置参数innodb_file_per_table为ON,并且重新启动服务后才可以生效。修改该参数影响的是后续数据库表空间管理方式,对于存量已经使用过的共享表空间和独立表空间无影响。

      show variables like '%innodb_file_per%';

        

mysql innodb 多文件存储 mysql innodb文件结构_内存结构_02

  下面具体看看该存储引擎架构,参考官方提供的相关图示如下:

    

mysql innodb 多文件存储 mysql innodb文件结构_内存结构_03

  从上图看主要是内存结构和磁盘结构两部分:

  一、内存结构

    内存结构主要包括Buffer Pool、Change Buffer、Adaptive Hash Index和Log Buffer四大组件。

  二、磁盘结构

    InnoDB磁盘主要包含Tablespaces、InnoDB Data Dictionary、Doublewrite Buffer、Redo Log和Undo Logs。

   InnoDB引擎使用的业务场景通过实践总结,如下:

    1、需要事务支持(具有较好的事务特性)。

    2、行级锁定对高并发有很好的适应能力,但需要确保查询是通过索引完成的。

    3、数据更新较为频繁的场景。

    4、数据一致性要求较高的业务,比如充值、银行转账等。

    5、硬件设备内存较大,可以利用InnoDB较好的缓存能力来提高内存利用率,仅可能减少磁盘I/O。