Innodb学习 | 青训营笔记

54 阅读3分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 13 天

InnoDB和MYISAM的区别

  1. InnoDB中不保存表的具体行数,而MYISAM对是单独存起来的。也就是说select count(*) from table 时,MYISAM会比InnoDB快的多。
  2. InnoDB是聚集索引,数据文件和索引绑在一起。但是辅助索引需要两次查询,先查询到主键,然后再通过主键查询到数据。因此,主键不应该过大,因为主键太大,其他索引也都会很大。而MyISAM是非聚集索引,数据文件是分离的,索引保存的是数据文件的指针。主键索引和辅助索引是独立的。(两个引擎底层数据结构都是B+树)
  3. InnoDB支持外键,而MyISAM不支持。
  4. Mysql 5.6之前版本,只有myisam支持全文索引,5.6之后,Innodb和myisam均支持全文索引,并且只能为CHAR、VARCHAR或text列创建。
  5. InnoDB支持数据行锁定,MyISAM不支持行锁定,只支持锁定整个表。

Next-key锁和gap锁

Next-Key锁是在存储引擎innodb、事务级别在可重复读的情况下使用的数据库锁,Next-Key锁 = 行锁+gap锁。

  • 唯一索引

    • 精确等值检索,Next-Key Locks就退化为记录锁,不会加gap锁
    • 范围检索,会锁住where条件中相应的范围,范围中的记录以及间隙,换言之就是加上记录锁和gap 锁。
  • 非唯一索引

    • 精确等值检索,Next-Key Locks会对间隙加gap锁(前开后闭),以及对应检索到的记录加记录锁。
    • 范围检索,会锁住where条件中相应的范围,范围中的记录以及间隙,换言之就是加上记录锁和gap 锁。
  • 非索引检索,全表间隙gap lock,全表记录record lock

MVCC和快照读

  • mysql中的快照读是通过MVCC+undolog实现的。
  • 快照读,顾名思义,就是读取快照数据,也就是说当某个数据正在被修改的时候,也可以进行读取该数据,保证读写不冲突。
  • 当我们对记录做变更操作时,就会产生undo记录,undo记录中存储的是老版数据,当一个旧的事务需要读取数据时,为了能够读取到老版本的数据,需要顺着undo列找到满足其可见性的记录,这个找满足可见行的记录依赖。就是说每次都是读取undolog中的数据。
  • MVCC也称多版本并发控制。
  • 不同事务或者相同事务的对同一记录的修改,会导致该记录的undo log成为一条记录版本线性表,undo log的链首就是最新的旧记录,链尾就是最早的旧记录。
  • 所以快照读都是去读取undolog中链首的最新的旧记录。(事务隔离级别为可重复读的情况下)