mysql数据库InnoDB介绍

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行级锁

  • 写不阻塞读操作,就算写操作改变了想读的记录,也可以通过回滚段读取前项的方式读到一致的内容。
  • 不同行间的写互相不阻塞
  • 并发性能好

发表回复