参考:https://dev.mysql.com/doc/refman/5.7/en/innodb-architecture.html
结构图:
1 缓冲池
缓冲表和索引数据,高频数据,缓冲池写磁盘时候一般直接写入系统表空间的双写缓冲区。对数据库数据进行操作时都是先读取到内存缓冲区进行操作后再写入磁盘。
缓冲池划分为若干页(链表)存储多行数据,采用LRU算法(最近最少使用)管理页。若需要增加页时,最近最少使用的页移除并且将新页添加在链表中间将链表划分为两块,新表5/8和旧表3/8。链表头部是常访问的,链表尾部是较低频次访问的,新页作为旧部的头。若旧部的页被访问到,则移动该页到链表头部,若链表中某页长时间不访问则移动到链表尾部。
2 变更缓冲区
用来存储二级索引变更的数据结构(缓冲池没有该内容),可能由insert,update,delete等dml操作造成的。后面会由读操作将页面加载到缓冲池合并。缓冲池周期性地将更改地索引页写进磁盘。在内存中,变更缓冲区属于缓冲池一部分,磁盘上,缓冲区属于系统表空间一部分,当数据库服务拓机时,索引变更存储在内存变更缓冲区。
3 自适应哈希索引
由系统变量 innodb_adaptive_hash_index开启。哈希索引由索引的前缀构建成。
4 日志缓冲区
记录要写进磁盘日志文件的数据,日志缓冲区大小由变量innodb_log_buffer_size配置,默认大小是16MB。日志缓冲区地内容周期性地写进磁盘日志文件中(redo),较大地日志缓冲区可以支持事务在提交前不必直接写磁盘redo文件,因此若有较多地dml操作事务,建议增大缓冲区减少磁盘IO。系统变量innodb_flush_log_at_trx_commit控制如何将缓存区内容写进磁盘,变量innodb_flush_log_at_timeout控制写磁盘地频率。
1. 表
InnoDB表和其索引一般创建在系统表空间中,独立表空间或者通用表空间。当参数innodb_file_per_table开启时并且是默认时,表被创建在独立的表空间。相反地,当参数没有开启时,表显式地创建在系统表空间。当创建一个InnoDB表时,在数据库目录MySQl会创建一个 .frm文件,当表创建在独立表空间时,默认会在数据库目录创建一个 .ibd表空间文件。
MySQL将表的数据词典信息存储在数据库目录的 .frm文件中。InnoDB还在系统表空间中自己的内部数据字典中对表的信息进行编码。
默认的行格式由参数innodb_default_row_format=DYNAMIC确定。若要使用Dynamic和compressed格式,参数innodb_file_per_table必须开启,innodb_file_format为Barracuda。或者,可以采用建表语句显式指定通用表空间,它支持所有行格式。
页大小为16kB时,一个表能够包含最大1017列(5.6.9版本前是1000),最大64个二级索引,如果大索引开启则能支持最大3072字节索引长度,否则是767字节长度,这些索引现在同样受限于联合索引。当页大小变为8KB或者4KB时,大索引长度按比例缩小至1536字节,768字节。联合索引最多16列。16KB页大小,不包括变长列的最大行长度为8000字节,64KB(65535 byte)页大小时,相应增长到16000字节。LONGBLOB,LONGTEXT小于4GB,包括BLOB和TEXT的列总长度小于4GB。当行长度小于页大小一半时,所有列存储内页内,若超过则变长列存储在溢出页。表空间大小大于10MB,最大依赖页大小,同样也是表的最大大小。行格式为Compressed的,页大小最大16KB。不同也大小的数据文件和日志文件不兼容。
InnoDB Page Size |
Maximum Tablespace Size |
4KB |
16TB |
8KB |
32TB |
16KB |
64TB |
32KB |
128TB |
64KB |
256TB |
2. 索引
2.1 聚集索引和二级索引
InnoDB表上的主键作为聚集索引,如果表上没有主键则InnoDB寻找到一个non-null且unique列作为聚集索引。如果都没有,则自主创建一个包含行ID的隐藏聚集索引。
一般情况下,根据聚集索引获取行会比较快,它会直接指向全部行数据存储的页。二级索引包含主键和用户定义的索引,走二级索引时先查出二级索引表中的主键,再回表根据主键去聚集索引查找数据。
2.2 InnoDB 索引的物理结构
InnoDB索引采用B-tree数据结构,空间索引采用R-tree数据结构,专为多维数据设计。索引记录存储在B-tree或者R-tree的叶子节点。
当由新记录插入InnoDB的聚集索引,InnoDB会尝试为后来的记录保留1/16空间。如果记录是有序插入,则索引页则可以存储15/16页大小,若无序,则可存储1/2到15/16页大小。
2.3 构建索引
三阶段构建索引,一,扫描聚集索引生成一个索引项并且将其添加到排序缓冲区。当缓冲区满了时,条目排序后会被写入一个临时中间文件。这个过程也称为运行(run)。二,当一个或多个运行写入临时中间文件时,对文件中所有条目执行合并排序。三,最终阶段,有序的条目插入到B-tree中。
2.4 FULLTEXT索引
FULLTEXT索引建立在CHAR, VARCHAR, TEXT列上,以加速查询和DML操作。FULLTEXT索引可以在建表时添加也可以修改表添加,搜索时用MATCH()…AGAINST语法。
(1)索引设计
FULLTEXT索引采用倒排索引设计。
(2)索引表
当创建一个FULLTEXT索引时,一系列辅助索引表同时创建。FTS_xxx_xxx_INDEX_0,FTS_xxx_BEING_DELETED,FTS_xxx_BEING_DELETED_CACHE,FTS_xxx_BEING_CONFIG,FTS_xxx_DELETED,FTS_xxx_DELETED_CACHE。第一类型表代表倒排索引表,同时存储位置信息和关联的文件ID。根据单词第一个字符在字符集中的权重排序后分布在不同的倒排索引表。采用多个倒排索引表可以支持并发索引创建,默认是两个线程,线程数量可以由innodb_ft_pll_degree设置。每个辅助索引表由一个表id(16进制数字)组成表明,以关联被索引的表,还有一个16进制数字表示表上这个索引的索引id。
如果主表创建为file_per_table,索引表存储在独自的表空间。
其他辅助索引表不是倒排索引,只是普通索引表处理FULLTEXT索引的删除。如果FULLTEXT索引删除了,这些表依旧保留。当一个FULLTEXT索引删除,会为索引创建一个FTS_DOC_ID,当然删除FTS_DOC_ID时要重构表。
FTS_xxx_BEING_DELETED,FTS_xxx_BEING_DELETED_CACHE表包含doc_id,指向一个删除文件,其FULLTEXT索引对应的数据并没有删除。Cache是缓存版本。
FTS_xxx_BEING_DELETED包含删除的文件,并且索引的数据 正在去除中。
FTS_*_CONFIG文件存储FULLTEXT索引的内部信息,存储表明被解析和存储到磁盘的文件FTS_DOC_ID。
(3)索引缓存
当一个文件插入,独立的单词和其关联的数据一并插入FULLTEXT索引中。这个过程中,尽管是小文件也会引起辅助索引表大量的插入操作,影响并发操作。避免这种问题,InnoDB采用缓存临时保持最近操作行的插入操作。这种内存缓存结构一直保留插入操作直到缓存满了,再批量保存到磁盘(辅助索引表)。可以通过INFORMATION_SCHEMA.INNODB_FT_INDEX_CACHE查看最近插入的行的标识。虽然缓存和批量操作避免频繁的更新辅助表,但也由可能再繁忙的插入更新操作时引起并发问题。为了避免同一个单词的多次插入更新操作提升插入效率,相同的单词会被合并为一个条目,最终保存到磁盘。参数innodb_ft_cache_size用来设置基于一张表的索引缓存大小,直接决定缓存到磁盘的频率。也可以设置一个全局参数innodb_ft_total_cache_size。已经被刷新到磁盘的数据,缓存中不会再保留。
(4)FULLTEXT索引文件ID和FTS_DOC_ID_Column
InnoDB采用唯一的文件标识映射索引单词和单词出现的文件记录。该映射需要被索引的表上有一个FTS_DOC_ID列,如果没有,InnoDB会在FULLTEXT索引创建时自动创建一个隐藏的ID列。在已有的表上创建FULLTEXT索引,系统会提示一个警告,这需要重建表增加ID列,可能引起性能问题。如果在建表时添加FULLTEXT索引则不会有这样的警告。若在建表时自行添加FTS_DOC_ID列,后期添加FULLTEXT索引时不会重建表,列名必须为FTS_DOC_ID,且为BIGINT类型,不能为空或重复,与之对应的需要创建一个FTS_DOC_ID_INDEX,如果没有创建系统会自动创建一个。为了避免重建表,FULLTEXT索引删除时ID列依旧保留。
(5)删除FULLTEXT索引
为了避免频繁操作辅助索引表,删除操作会先记录在FTS_*DELETED表。缺点是删除操作后,索引表不会立即变小。可以在被索引表上运行OPTIMIZE TABLE以剔除删除的索引,innodb_optimize_fulltext_only=on参数。
(6)FULLTEXT索引事务
由于FULLTEXT索引的缓存和批量操作特性,它有自己特殊的事务处理。当FULLTEXT索引更新或者插入时只有在事务提交时处理,意味着索引搜索只能看见已经提交的数据。
(7)监控FULLTEXT索引
查询以下INFORMATION_SCHEMA表:
INNODB_FT_CONFIG
INNODB_FT_INDEX_TABLE
INNODB_FT_INDEX_CACHE
INNODB_FT_DEFAULT_STOPWORD
INNODB_FT_DELETED
INNODB_FT_BEING_DELETED
也可以通过查询INNODB_SYS_INDEXES和INNODB_SYS_TABLES
3. 表空间
3.1 系统表空间
InnoDB系统表空间包含InnoDB数据词典和存储区域(双写缓冲区,变更缓冲区和撤销日志),也包含用户创建的表和索引数据。系统表空间可以有一个或多个数据文件。默认情况下,一个创建在数据目录的系统表空间文件命名为ibdata1。系统表空间数据文件的大小和数量由innodb_data_file_path启动项控制。
(1)更改系统表空间大小
最简单的方法是一开始就设置为自动扩展模式。当空间不足时,文件自动扩大64MB。可由innodb_autoextend_increment系统变量设置增量大小。也可以由增加文件的方式扩展。这个方法必须关掉服务,在innodb_data_file_path末尾添加新文件后重启,服务重启时系统会创建初始化这个文件。
不能从表空间删除数据文件,只能先导出所有表包括InnoDB系统表,关闭服务,去除所有*.ibd文件以及系统*.ibd,表的frm文件,设置一个新的表空间,重启服务,导入之前导出的文件。
(2)可以采用原始磁盘分区作为InnoDB系统表空间中的数据文件。这个技术支持Windows及一些Linux/Unix系统无缓冲区的I/O操作而且不需要额外系统开销。采用磁盘原始分区时,必须保证mysql对这个分区有读写权限。
3.2 独立表空间
每个InnoDB表存储在各自的表空间文件(tbl_name.ibd)。由参数innodb_file_per_table控制是否开启。不同于MyISAM存储引擎采用tblname.MYD和tblname.MYI分别存储索引和数据,InnoDB用一个tblname.ibd文件存储数据和索引,tblname.frm文件依旧创建。将表从系统空间移动到独立表空间,开启innodb_file_per_table参数重建表。使用CREARE TABLE…TABLESPACE 或者ALTER TABLE…TABLESPACE语法修改表空间类型。系统表空间一直需要用来存储数据词典和撤销日志。将表从系统表空间移动到独立的表空间,系统表空间大小不会改变,空闲的空间用来继续存储新的数据,只能通过重建整个实例变动系统表空间大小。
优点:
(1)当截断或者删除表时,可以回收磁盘空间。截断或者删除系统表空间类型的表时(ibd文件内),这些空间会成为空闲空间,只能用于新InnoDB数据。
(2)截取数据速度会更快。
(3)为了IO优化、空间管理或则备份,可以将具体的表存储在独立的存储设备上。
(4)可以运行OPTIMIZE TABLE来压缩或者重建表空间。当运行优化表时,系统会创建一个临时的ibd文件,存储实际表数据,完成后由新文件替换旧旧文件,旧文件删除。
(5)可以移动独立的表,而不是移动整个库。
(6)可以将表复制到另一个实例中。
(7)表类型采用Barracuda文件格式,支持compressed和dynamic行格式。
(8)采用dynamic行格式存储BLOB和TEXT类型存储效率更高。
(9)崩溃后恢复或者备份方便。
(10)方便监控表大小和状态。
(11)支持并发写。
(12)系统表空间存储数据词典和撤销日志是有大小限制,而独立表空间大小由自己控制。
缺点:
(1)每个表由自己的独立文件,只能由表内的数据使用。如果文件空间管理不当,容易产生一些空闲空间。
(2)fsyn操作只能运行在每个表上,多个表的写操作并不会合并为一个IO操作。
(3)mysqlId必须为每个表保留一个打开的文件句柄,如果表空间中有许多表,可能会影响性能。
(4)更多的文件描述符。
3.3 通用表空间
通用表空间即共享的InnoDB表空间,采用CREATE TABLESPACE语法创建。
(1)通用表空间功能
和系统表空间类似,通用表空间是共享的表空间可以存储多个表的数据。
通用表空间内存性能比独立表空间要好。服务在表空间的生命周期内将表空间元数据保存在内存中。多个表在通用表空间内占用表空间元数据内存比独立表空间要少。
通用表空间数据文件可以存放在相对于或者独立于MySQL数据目录的目录中,MySQL数据目录提供许多数据文件的存储和管理。于独立表空间一样,将数据文件放置在MySQL数据目录之外允许你单独管理关键表的性能,为特定的表设置RAID或者DRBD或者将表绑定到特定的磁盘。
通用表空间支持Antelope和Barracuda文件格式,因此支持所有行格式和相关特性。不依赖innodb_file_format和innodb_file_per_table参数,同时这些参数对通用表空间无影响。
TABLESPACE选项可以采用CREATE TABLE指定通用表空间,独立表空间,系统表空间。也可以采用ALTER TABLE修改表指定表空间。
(2)创建通用表空间
通用表空间可以创建在数据目录内或者外面,避免和独立表空间冲突,在数据目录的子目录下创建是不支持的。在数据目录外创建通用表空间前,指定目录必须存在。当通用表空间在MySQL数据目录外创建时,数据目录内会创建一个.isl文件。
例:CREATE TABLESPACE `ts1` ADD DATAFILE '../my_tablespace/ts1.ibd' Engine=InnoDB;
(3)添加表到通用表空间
例:CREATE TABLE t1 (c1 INT PRIMARY KEY) TABLESPACE ts1;
ALTER TABLE t2 TABLESPACE ts1;
(4)通用表空间行格式
通用表空间支持所有行格式(REDUNDANT,COMPACT,DYNAMIC,COMPRESSED),压缩和非压缩的表不能同时存在一个表空间内,由于物理页大小不同。对于通用表空间的压缩表,FILE_BLOCK_SIZE必须指定,而且与innodb_page_size值相关的有效压缩值,KEY_BLOCK_SIZE=FILE_BLOCK_SIZE/1024。
InnoDB Page Size (innodb_page_size) |
Permitted FILE_BLOCK_SIZE Value |
Permitted KEY_BLOCK_SIZE Value |
64KB |
64K (65536) |
Compression is not supported |
32KB |
32K (32768) |
Compression is not supported |
16KB |
16K (16384) |
N/A: If innodb_page_size is equal toFILE_BLOCK_SIZE, the tablespace cannot contain a compressed table. |
16KB |
8K (8192) |
8 |
16KB |
4K (4096) |
4 |
16KB |
2K (2048) |
2 |
16KB |
1K (1024) |
1 |
8KB |
8K (8192) |
N/A: If innodb_page_size is equal toFILE_BLOCK_SIZE, the tablespace cannot contain a compressed table. |
8KB |
4K (4096) |
4 |
8KB |
2K (2048) |
2 |
8KB |
1K (1024) |
1 |
4KB |
4K (4096) |
N/A: If innodb_page_size is equal toFILE_BLOCK_SIZE, the tablespace cannot contain a compressed table. |
4K |
2K (2048) |
2 |
4KB |
1K (1024) |
1 |
如果不指定FILE_BLOCK_SIZE,系统会默认和页大小一样,这样只能存储非压缩的表。
(5)表空间之间转移表
可以使用ALTER TABLE…TABLESPACE…,转移表空间。如果转移到系统表空间,该空间名为innodb_system,若转移到独立表空间则为innodb_file_per_table。就算表空间不变,这个操作依旧会引起表的重建。不支持从临时表空间转移到持久化的表空间。
(6)删除通用表空间
DROP TABLESPACE,执行这个命令前,表空间内的所有表必须先删除,否则删除错误。表空间删除只能使用这个命令,删除库并不会删除表空间。和系统表空间一样,删除或者截取表,ibd数据文件的空闲空间只能用于新数据。同独立表空间一样,删除表时空间不会释放回操作系统。
(7)通用表空间限制
已经生成的表空间不能改为通用表空间。
不支持创建临时通用表空间。
通用表空间不支持临时表。
存储在通用表空间中的表只能在支持通用表空间的MySQL版本中打开。
与system表空间类似,截断或删除存储在普通表空间中的表会在普通表空间.ibd数据文件中创建内部空闲空间,该文件只能用于新的InnoDB数据。同独立表空间一样,空间不会释放回操作系统。
通用表空间的表,ALTER TABLE ... DISCARD TABLESPACE 和 ALTER TABLE ...IMPORT TABLESPACE 不支持。
在一般表空间中放置表分区已经在5.7.24版本中弃用,在将来的MySQL版本中将删除这种支持。
3.4 撤销的表空间
撤销表空间包含撤销记录,包括如何用事务撤销最新变更的聚集索引记录。回滚块包含撤销记录块,撤销记录在撤销记录块。参数innodb_rollback_segments定义每个撤销表空间的回滚块数量。
撤销记录可以存储在一个或者多个撤下表空间,而不是系统表空间。这个布局与默认撤销记录在系统表空间配置不一样。这种撤销日志的IO模式使得撤销表空间更适宜采用SSD存储模式,系统表空间存储在硬盘上。撤销表空间数量由innodb_undo_tablespace配置参数控制,只能在初始化MySQL实例时设置,之后就不能更改。这个参数在后续版本中会弃用。撤销表空间及表空间中的独立块不能删除,尽管如此,撤销记录是可以被截断的。
设置
为一个MySQL实例设置撤销表空间如下:
(1)为撤销表空间指定目录路径,innodb_undo_directory,如果没有指定则创建在数据目录中。
(2)定义回滚块数量,innodb_rollback_segments,默认是128,同时也是最大值。第一个回滚块总是被分配到系统表空间,2-33个分配到临时表空间,因此回滚块序号大于33的才会分配到撤销表空间。
(3)定义撤销表空间数量,innodb_undo_tablespace,默认0,在MySQL实例的生命周期内固定。
(4)创建MySQL实例。
截断撤销表空间
截断撤销表空间需要至少有两个活动的撤销表空间,保证一个下线截断时另一个可用。保证innodb_undo_log_truncate参数开启,开启后表空间大小上限由动态参数innodb_max_undo_log_size决定,默认是1024MB。
当innodb_undo_log_truncate开启:
(1)撤销表空间上限由innodb_max_undo_log_size决定。截断用的撤销表空间循环选举执行,避免每次都用同一个表空间。
(2)选中的表空间内的回滚块置为失效状态,避免新的事务分配过来。
(3)清除系统释放不在使用的回滚块。
(4)撤销表空间中的所有回滚块释放后,截断操作开始执行并将撤销表空间恢复到初始大小。初始表空间大小依赖页大小,默认16KB页大小有10MB撤销表空间,4KB对7MB,8KB对8MB,32KB对20MB,64KB对40MB。
(5)回滚块重启启用,可以接受新事务。
默认情况下,清除线程寻找撤销表空间每128次截断一次,频率由innodb_purge_rseg_truncate_frequency参数控制,默认等于128。当撤销表空间每次截断时,表空间内的回滚块失效,其他表空间的有效回滚块承担整个系统的加载,有可能会引起性能下降。依赖以下几个因子:
(1)撤销表空间数量
(2)撤销记录数量
(3)撤销表空间大小
(4)IO子系统速度
(5)已经执行的长事务
(6)系统加载
最直接的方式是扩大撤销表空间数量。
3.5 临时表空间
非压缩,用户创建的和磁盘上的内部临时表都在共享临时表空间。参数innodb_temp_data_file_path定义了临时表空间文件的相对路径,名称,大小和属性,如果参数没有设置值,默认会在innodb_data_home_dir文件夹创建一个自动扩展的文件ibtmp1,比12MB稍微大一些。压缩的临时表在临时文件目录的独立表空间。临时表空间在在停机或者终止初始化时删除,在每次服务启动时再次创建。临时表空间创建时有一个自增长的空间ID。若服务意外停机则不会删除临时表空间,利用管理员账号可以手动删除。
3.6 创建表空间在数据目录外
CREATE TABLE…DATA DIRECTORY语法可以在数据目录外创建独立表空间。表空间数据文件创建在指定目录,目录内部有个数据库名命名的子目录。数据目录下的数据库目录会创建一个包含表空间路径的isl文件,这个文件实质上就是一个符号链家文件。
4.数据字典
InnoDB数据字典由内部系统表组成,这些系统表包含用于追踪表,索引和表列的元数据。物理结构上,这些元数据存储在系统表空间。由于历史原因,数据字典元数据与InnoDB表元数据文件(.frm文件)信息在一定程度上重复。
5.双写缓冲
双写缓冲位于系统表空间的一个存储区域,只有在页写进双写缓冲后,InnoDB将从缓冲区刷新的页面写入文件的合适位置。如果操作子系统,存储系统或者mysqlId在写页时崩溃,InnoDB可以从双写缓冲中找到该页面的副本以恢复故障。尽管数据总是写两次,但是doublewrite缓冲区并不需要两倍的I/O开销或两倍的I/O操作。数据作为一个大的连续块写入到doublewrite缓冲区本身,并对操作系统进行一个fsync()调用。变量innodb_doublewrite为0时双写缓冲关闭。
如果系统表空间文件(ibdata文件)位于支持原子写入的Fusion-io设备上,则自动禁用双写缓冲,所有数据文件都使用Fusion-io原子写入。因为双写缓冲区设置是全局的,所以对于驻留在非fusion -io硬件上的数据文件也禁用双写缓冲。该特性仅在Fusion-io硬件上受支持,并且仅在Linux上为Fusion-io NVMFS启用。为了充分利用这个特性,建议使用的innodb_flush_method:O_DIRECT设置。
6. Redo log
Redo日志是用来故障恢复时修正数据的,是一种基于磁盘的数据结构。一般情况下,redo日志在磁盘上由两个主要文件ib_logfile0和ib_logfile1展现。数据通过redo日志的传递由一个不断增长的LSN值表示。更改日志文件大小,innodb_log_file_size,更改文件数量innodb_log_files_in_group。如果innoDB检测到innodb_log_file_size和日志文件大小不一致,系统会写一个日志核查点,关闭并移除旧的日志文件,并重新创建并打开新的日志文件。InnoDB,或其他符合ACID的数据库引擎,在提交事务之前刷新事务的redo日志。InnoDB采用组提交将多个刷新请求聚合,避免一次提交一次刷新。
7. Undo log
单个读写事务的撤销记录集合,包含最近一次如何撤销聚集索引修改的记录信息。如果另一个事务需要读到原始数据,未修改的数据可以从撤销记录获取。撤销记录在撤销记录块,包含在回滚块,回滚块在系统表空间内的撤销表空间和临时表空间。临时表空间内的撤销记录是为事务在临时表修改数据用,并不用于故障修复,仅用来回滚。由于无重做记录IO操作,性能较好。InnoDB支持最大128个回滚块,其中32个位于临时表空间,剩余96个回滚块可以分配到普通表的事务中。Innodb_rollback_segments变量定义回滚块的数量。一个回滚块支持的事务数依赖回滚块的撤销槽有多少以及每个事务需要的撤销记录数量。
InnoDB Page Size |
Number of Undo Slots in a Rollback Segment (InnoDB Page Size / 16) |
4096 (4KB) |
256 |
8192 (8KB) |
512 |
16384 (16KB) |
1024 |
32768 (32KB) |
2048 |
65536 (64KB) |
4096 |
一个事务会分配四种撤销记录:
用户定义表的Insert操作;
用户定义表的update和delete操作;
用户定义的临时表上的insert操作;
用户定义的临时表上的update和delete操作;
基于以上因素,下面是InnoDB事务容量支持的预估公式:
(1)如果一个事务执行一个insert或update或delete操作,支持的并发量
(innodb_page_size / 16) * (innodb_rollback_segments - 32)
(2)如果一个事务执行insert和update或delete操作,支持并发量
(innodb_page_size / 16 / 2) * (innodb_rollback_segments - 32)
(3)一个事务在临时表上执行insert操作,支持并发量
(innodb_page_size / 16) * 32
(4)一个事务在临时表上执行insert和update或delete操作
(innodb_page_size / 16 / 2) * 32