Innodb存储引擎
支持事务,所以崩溃后可以通过事务日志恢复数据。
数据存储在Innodb黑盒的表空间tablespace
数据和索引存放在单独的文件中
实现了标准的四个隔离级别
默认RR,通过MVCC+间隙锁防止幻读
间隙锁
MVCC会锁定涉及到的数据行
间隙锁会对索引中,间隙进行锁定,防止幻影行的插入
回表
Innodb主键为聚集索引,聚集索引的节点上存放了整行数据。
其他索引为非聚集索引,非聚集索引叶子结点只存放聚集索引。
回表即:当通过非聚集索引查询数据时,Innodb先通过飞聚集索引找到聚集索引值。再查询聚集索引找到行数据。
Innodb索引
主键为聚集索引,再其他二级索引中会存放聚集索引。如果主键过大,会使索引数据膨胀过快;如果索引比较多,那么应该让主键尽可能小。
MyISAM存储引擎
- 优点:结构简单,查询速度快、支持全文索引、表压缩、空间函数等。支持并发插入,concurrent insert。我理解即写锁的插队。
- BLOB和TEXT字段也支持500字符的索引。
- 缺点:不支持行锁和事务。崩溃后数据无法恢复。
- 压缩表,适用于数据导入后不会再修改的表。好处是减少磁盘空间占用,也就减少了磁盘IO,提升查询性能。myisampack进行压缩,压缩表数据及索引不支持修改。压缩表压缩记录为独立压缩。所以读取单行时不需要解压整个表。
MyISAM支持表修复,但并不是数据恢复,而是检查表中错误,可能存在数据丢失问题。如开启了DELAY_KEY_WRITE延迟更新索引键,每次修改操作后不会立刻将修改的索引数据写入磁盘,而是写入内存缓冲区。只有当清理in-memory key buffer或者关闭表时才会将索引数据写入磁盘。好处是极大的提升了性能;问题是当发生数据库崩溃时,会造成索引损坏。这时候要通过表修复工具进行修复。DELAY_KEY_WRITE可以单表开启或者全局开启。
Archive存储引擎
- 非事务引擎
- 只支持insert和select,执行update/delete时会报错don‘t have this option
- 支持行锁和缓冲区,可实现高并发插入
- 批量插入在完成之前对查询不可见
- 缓存所有写数据,增加查询速度
- 利用zlib对插入的行进行压缩,压缩比约为1:10,所以磁盘IO数据量更少。插入性能更高与Innodb和MyISAM。
- 支持非聚集索引!但只支持自增索引!所以数据智能递增,如果最大数据为10;想添加一个id为9的数据会报错重复的key。猜测是自己填充了。
- 最佳实践表主键自增,并且使用Mysql的自增auto_increment
- 最佳场景为数据不会更改的需求如:请求分析的请求记录
Memory存储引擎
- schama定义在磁盘,但数据只存在内存中
- 内存操作,速度更快!
- 适用于数据不怕丢的场景
- 支持hash和b+tree索引