MySQL

innodb_flush_log_at_trx_commit:控制了重做日志写盘和落盘策略。

可选值的安全性从0->2->1递增,分别对应于mysqld 进程crash可能丢失 -> OS crash可能丢失 -> 事务安全。

Best Practice

关于count(*)

MyISAM会直接存储总行数,InnoDB则不会,需要按行扫描。只有查询全表的总行数,MyISAM才会直接返回结果,当加了where条件后,两种存储引擎的处理方式类似。

关于全文索引

MyISAM支持全文索引,InnoDB 5.6之前不支持全文索引。不管哪种存储引擎,在数据量大并发量大的情况下,都不应该使用数据库自带的全文索引,会导致小量请求占用大量数据库资源。

关于事务

MyISAM不支持事务,InnoDB支持事务。事务是选择InnoDB非常诱人的原因之一,它提供了commit,rollback,崩溃修复等能力。在系统异常崩溃时,MyISAM有一定几率造成文件损坏。

关于外键

MyISAM不支持外键,InnoDB支持外键。不管哪种存储引擎,在数据量大并发量大的情况下,都不应该使用外键,而建议由应用程序保证完整性。

关于行锁与表锁

MyISAM只支持表锁,InnoDB可以支持行锁。MyISAM执行读写SQL语句时,会对表加锁,所以数据量大,并发量高时,性能会急剧下降。InnoDB细粒度行锁,在数据量大,并发量高时,性能比较优异。


InnoDB 数据页解析

MySQL默认的非压缩数据页为16KB。数据页的头尾除了一些元信息外,还有Checksum校验值,这些校验值在写入磁盘前计算得到,当从磁盘中读取时,重新计算校验值并与数据页中存储的对比,如果发现不同,则会导致MySQL crash。

InnoDB的数据页有很多种,比如:索引页,Undo页,Inode页,系统页,BloB页等。

数据页包括七个部分,数据页文件头,数据页头,最大最小记录,用户记录,空闲空间,数据目录,数据页尾部。

数据页分两大部分,一部分存储数据记录,按照记录的大小通过记录的指针连接起来。另外一部分存储数据页的目录,用来加速查找。

数据页文件头(Fil Header)

FIL_PAGE_SPACE_OR_CHKSUM: 占四字节,用来存储数据页的checksum。

FIL_PAGE_OFFSET:对应数据页的page number,每个表空间从0开始,即这个值乘以数据页的大小就可以得到数据页在文件中的起始偏移量。

Reference :

  1. InnoDB,5项最佳实践,知其所以然?
  2. InnoDB,select为啥会阻塞insert?
  3. MySQL · 引擎特性 · InnoDB 数据页解析