innoDB的一点笔记

核心概念:

  • 后台线程(master thead|IO thead|purge thead)、缓存(INODE缓存、INDEX缓存、插入缓存、重做日志缓存、)、重做日志、bin-log、checkpoint、聚集索引、辅助索引、数据页;
  • Insert Buffer:对于非聚集索引的插入或者更新操作,不是每一次直接插入到索引页,而是先判断插入的非聚集索引是否在缓存池中,若在,则直接插入;若不在,则先放入到一个Insert Buffer对象里,再由后台线程定时合并(merge)到辅助索引页中。这是一棵全局B+树。
  • 异步IO:缓存池中的数据页写入磁盘时,使用异步IO,合并写入;
  • binlog:mysql记录的二进制日志,是基于statement的逻辑日志,主从复制一般基于这个日志,事务提交时写入磁盘。
  • redo log: InnoDB引擎记录的物理日志(数据页),保证数据的可靠性,先于数据页写入磁盘。用来保证事务的原子性和持久性。
  • undo log: InnoDB引擎记录的事务逻辑日志(数据行),当事务回滚时使用。InnoDB的MVCC也是通过undo log来实现的。用来保证事务的一致性。
  • 聚集索引:是一棵B+tree,非叶子节点存放key值(整个索引的部分key值),叶子节点存放key值+行记录,一页存放多条数据,页之间是一个链表结构。
  • 辅助索引:也是一棵B+tree,非叶子节点和聚集索引相同,叶子节点存放的是key值+主键的值,页之间是一个链表结构。
  • checkpoint:innodb的技术,定时将脏页刷入磁盘。通过LSN来标记版本;减少内存占用,减少宕机时的恢复时长。

数据插入的过程:binlog怎么写?redo log怎么写?

  • 开启事务
    插入数据放入缓冲池数据页;
    记录undo log到缓冲池;
    非唯一的辅助索引放入Insert Buffer;唯一辅助索引放入缓存池索引页;
    重做日志放入重做日志缓存(包括数据的redo log和undo log的redo log);--》 后台线程定时把重做日志缓存刷入文件;
  • 提交事务
    InnoDB进行prepare操作;
    mysql写入binlog;fsync;
    InnoDB写入redo log,调用fsync确保日志都从重做日志缓存写入磁盘;
  • 完成事务
    后台线程定时将缓存池中的脏页写入磁盘,按照主键的顺序写入聚集索引页;写入辅助索引页;异步IO、合并写入;
    后台线程定时将缓存池中的undo log写入磁盘;
    后台线程定时执行full purge操作,删除无用undo log,真正删除没有被引用的update、delete记录;

数据修改的过程:

过程和插入一样,只是对修改数据的处理不一样:
将原来的数据标记为删除;
插入一条新的数据;
生成undo log;生成redo log;
事务提交,purge线程检查历史版本的数据是否可删除(如果有其他事务引用就延迟删除);

插入时宕机怎么恢复:

事务未提交:
根据redo log完成数据页和undo log页的修改;
根据undo log回滚未提交事务;。
事务已提交:
这种情况,mysql的bin log已经写入磁盘,redo log也已经写入磁盘。只需要根据redo log,完成数据页的修改即可。

数据查询的过程:

  • 搜索主键:
    主键是B+树,找到值所在的页;
    把页加载入内存,在内存中查找到数据行;
  • 搜索辅助索引:
    搜索B+树,定位到叶子节点,找到主键的值;
    搜索主键;
  • 搜索无索引列:
    通过主键的叶子节点做全表遍历;
  • 范围搜索:
    找到第一个节点,然后按照链表依次往后搜索;

Innodb数据存储结构:

表空间、段、区-1MB、页-16K
B+树,叶子节点保存数据,非叶子节点保存索引

隔离级别是怎么产生作用的?版本的粒度是行还是表?

innodb对行数据使用版本管理,当修改一条数据时,会产生一条最新的数据,而之前的数据就成为了一个历史版本;

  • 在READ COMMITTED隔离级别下:
    两个事务一个查一个改:查询sql总是读取到最新的数据版本;
    两个同时改:按行锁定,一个事务会查到另一个事务插入或新增的数据(幻读);
  • 在REPEATABLE READ隔离级别下:
    两个事务一个查一个改:查询sql总是读取到事务开始时的那个版本;
    两个同时改:按照范围锁定,消除了幻读;

B树和B+树的主要区别:

B树的非叶子节点也存放数据;B+树是B树的变种,只有叶子节点才存放值,这样非叶子节点能存放更多的key,树的层树就更少,就会有更好的查找性能。

B+树的节点和页是什么关系?一层一页,还是一层多页?多层一页?

一般树的高度在2~4层;末级是数据页,上层是主键索引页。索引页和数据页都是一个页存多条数据。不会存在多层一页的情况,一层多页。

联合索引的结构:

联合索引也是一颗B+树,不过key是多个值的组合。

你可能感兴趣的:(innoDB的一点笔记)