mysql数据库InnoDB介绍
存储引擎就是数存储的方式。
myIsam的数据表可以直接复制到其它的库中使用,但InnoDB的不行。
系统文件:
ibdata1:每个数据库实例一个,它是系统表空间文件。
redo log日志:ib_logfile0,ib_logfile1;
.frm文件:表结构文件。
.ibd文件:实际数据。
ibdata1文件存放什么? | |
回滚段 | 事务隔离性要求,要读到前项 |
所有InnoDB表的元数据信息 | 这也是InnoDB表不能直接copy的原因 |
Double write, Insert buffer dump等等 | |
自动扩展机制 | 在初始时,可以设置ibdata1文件的大小属性,当回滚文段超过存储大小时,ibdata1会自动扩展大小,但是该文件不能收缩。 |
MySQL、InnoDB实例初始化时就应该被配置的参数:
参数 | 样例值 | 备注 |
innodb_data_home_dir | 系统表空间文件(ibdata1)的目录,如果没有指定值,系统表空间文件就会存在datadir目录下 | |
innodb_log_group_home_dir | 这个文件夹存放innoDB redo log文件, | |
innodb_data_file_path | ibdata1:12M:autoextend | ibdata1文件的初始属性,autoextend属性很重要,用于自动扩展大小 |
innodb_autoextend_increment | 64 | 单位是M,值太大会造成每次扩展的效率很慢,值太小又会频繁的扩展阻塞回滚段事件 |
innodb_file_per_table | 1 | 如果这个变量设置成0,也就是不开启状态,那么所有的数据都会写到ibdata1中 |
innodb_log_file_size | 50331648 | 该参数指的是redo log文件的大小,MYSQL5.7中默认值50331648,单位字节。(ib_logfile0,ib_logfile1) |
innodb_log_files_in_group | 2 | 每个实例有几个redo log文件。文件最大(innodb_log_file_size * innodb_log_files_in_group)512GB。 |
redo log:一种基于磁盘的数据结构,用于灾难恢复(crash recovery),正确的处理未完成的事务写数据操作。
log file:ib_logfileN中的一个,它组成了redo log。数据从log buffer内存区域写到这些文件中。
InnoDB数据文件的存储结构:
- 索引组织表(聚簇表),不同于myIsam的堆表(按顺序写入文件,先写入的在前面),使用平衡二叉树结构。
- 根据表逻辑主键排序写入,所有的值都在二叉树的叶子节点上。
- 数据节点每页16K大小
所以InnoDB表根据主键寻址速度很快;主键值递增的insert插入效率较好,因为不用寻找插入位置,直接在后面扩展叶子节点就可以,反而随机的插入操作效率较差;如果表没有主键,系统会随机分配一个字符串做为主键,因此,InnoDB表必须指定主键,建议使用自增数字。
InnoDB数据块缓存池
- 数据的读写必须经过缓存池
- 数据以整页(16K)为单位读到缓存中
- 缓存中的数据以LRU(最近最少使用)策略换出
InnoDB Buffer Pool相关参数
参数 | 样例值 | 备注 |
innodb_buffer_pool_size | 134217728 | 根据总物理内存设置,70%或10%的物理总内存数。如果数据库为独立的服务器设置为70%。单位:字节。这个变量要在实例启动前改变。 |
InnoDB数据持久化与事务日志
参数 | 样例值 | 备注 |
innodb_flush_log_at_trx_commit | 1 | 0:每隔1s写入并持久化一次日志 1:每次commit都写入并持久化日志 2:每次提交日志写到系统内存,每1s持久化一次 |
InnoDB行级锁
- 写不阻塞读操作,就算写操作改变了想读的记录,也可以通过回滚段读取前项的方式读到一致的内容。
- 不同行间的写互相不阻塞
- 并发性能好