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是多个值的组合。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,826评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,968评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,234评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,562评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,611评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,482评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,271评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,166评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,608评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,814评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,926评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,644评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,249评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,866评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,991评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,063评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,871评论 2 354

推荐阅读更多精彩内容