MySQL技术内幕:InnoDB存储引擎的目录

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL技术内幕:InnoDB存储引擎的目录相关的知识,希望对你有一定的参考价值。

参考技术A

推荐序
前言
致谢
第1章 mysql体系结构和存储引擎
1.1 定义数据库和实例
1.2.mysql体系结构
1.3 mysql表存储引擎
1.3.1 innodb存储引擎
1.3.2 mylsam存储引擎,
1.3.3 ndb存储引擎
1.3.4 memory存储引擎
1.3.5 archive存储引擎
1.3.6 federated存储引擎
1.3.7 maria存储引擎
1.3.8其他存储引擎
1.4 各种存储引擎之间的比较
1.5 连接mysql
1.5.1 tcp/ip
1.5.2命名管道和共享内存
1.5.3 unix域套接宇
.1.6 小结
第2章 innodb存储引擎
2.1.innodb存储引擎概述
2.2 innodb体系架构
2.2.1后台线程
2.2.2内存
2.3 masteithread
2.3.1 masterthread源码分析
2.3.2 masterthread的潜在问题
2.4 关键特性
2.4.1插入缓冲
2.4.2两次写
2.4.3自适应哈希索引
2.5 启动、关闭与恢复
2.6 innodbplugin:新版本的innodb存储
引擎
2.7 小结
第3章 文件
3.1 参数文件
3.1.1什么是参数
3.1.2参数类型
3.2 日志文件
3.2.1错误日志
3.2.2慢查询日志
3.2.3查询日志
3.2.4二进制日志
3.3 套接字文件
3.4 pid文件
3.5 表结构定义文件
3.6 innodb存储引擎文件
3.6.1表空间文件
3.6.2重做日志文件
3.7 小结
第4章 表
4.1 innodb存储引擎表类型
4.2 innodb逻辑存储结构
4.2.1表空间
4.2.2段
4.2.3区
4.2.4页
4.2.5行
4.3 innodb物理存储结构
4.4 innodb行记录格式
4.4.1 compact行记录格式
4.4.2 redundant行记录格式
4.4.3行溢出数据
4.4.4 compressed与dynamic行记录格式
4.4.5 char的行结构存储
4.5 innodb数据页结构
4.5.1 fileheader
4.5.2 pageheader
4.5.3 infimum和supremum记录
4.5.4 userrecords与freespace
4.5.5 pagedirectory
4.5.6 filenailei
4.5.7 innodb数据页结构示例分析
4.6 namedfileformats
4.7 约束
4.7.1数据完整性
4.7.2约束的创建和查找
4.7.3约束和索引的区别
4.7.4对于错误数据的约束
4.7.5 enum和set约束
4.7.6触发器与约束
4.7.7外键
4.8 视图
4.8.1视图的作用
4.8.2物化视图
4.9 分区表
4.9.1分区概述
4.9.2 range分区
4.9.3 list分区
4.9.4 hash分区
4.9.6 columns分区
4.9.7子分区
4.9.8分区中的null值
4.9.9分区和性能
4.10 小结
第5章 索引与算法
5.1 innodb存储引擎索引概述
5.2 二分查找法
5.3 平衡二叉树
5.4 b+树
5.4.1 b+树的插入操作
5.4.2 b+树的删除操作
5.5 b+树索引
5.5.1聚集索引
5.5.2辅助索引
5.5.3 b+树索引的管理
5.6 b+树索引的使用
5.6.1什么时候使用b+树索引
5.6.2顺序读、随机读与预读取
5.6.3辅助索引的优化使用
5.6.4联合索引
5.7 哈希算法
5.7.1哈希表
5.7.2 innodb存储引擎中的哈希算法
5.7.3自适应哈希索引
5.8 小结
第6章 锁
6.1 什么是锁
6.2 innodb存储引擎中的锁
6.2.1锁的类型
6.2.2一致性的非锁定读操作
6.2.3 selectforupdp/te&selectlockinsharemode
6.2.4自增长和锁
6.2.5外键和锁
6.3 锁的算法
6.4 锁问题
6.4.1丢失更新
6.4.2脏读
6.4.3不可重复读
6.5 阻塞
6.6 死锁
6.7 锁升级
6.8 小结
第7章 事务
7.1 事务概述
7.2 事务的实现
7.2.1 redo
7.2.2 undo
7.3 事务控制语句
7.4 隐式提交的sql语句
7.5 对于事务操作的统计
7.6 事务的隔离级别
7.7 分布式事务
7.8 不好的事务习惯
7.8.1在循环中提交
7.8.2使用自动提交
7.8.3使用自动回滚
7.9 小结
第8章 备份与恢复
第9章 性能调优
第10章 innodb存储引擎源代码的编译

《mysql技术内幕 InnoDB存储引擎(第二版)》阅读笔记

一、mysql架构

mysql是一个单进程多线程架构的数据库。

 

二、存储引擎

InnoDB:

  • 支持事务
  • 行锁
  • 读操作无锁
  • 4种隔离级别,默认为repeatable
  • 自适应hash索引
  • 每张表的存储都是按主键的顺序记性存放
  • 支持全文索引(InnoDB1.2.x - mysql5.6)
  • 支持MVCC(多版本并发控制)实现高并发

MyISAM:

  • 不支持事务
  • 表锁
  • 支持全文索引

 

三、InnoDB体系架构

1、后台线程

  • Master Thread
    • 负责将缓冲池中的数据异步刷新到磁盘,保证数据的一致性
  • IO Thread
    • 负责IO请求的回调处理  
  • Purge Thread
    • 回收已经使用并分配的undo页(事务提交后,其所使用的undolog不再需要)

2、内存池

  • 缓冲池(一块内存区域)
    • InnoDB基于磁盘存储,将记录按照的方式进行管理(由于基于磁盘,速度较慢,所以需要引入缓冲池提高性能)
    • 读取页:先从缓冲池获取,缓冲池没有,才会从磁盘获取
    • 修改页:先写重做日志缓冲,再修改缓冲池中的页,然后以一定的频率刷新到磁盘(Checkpoint机制),在还没有刷新到磁盘之前,该页被称为脏页
    • innodb_buffer_pool_size设置大小
    • 存放对象:索引页、数据页、自适应hash索引和lock信息
    • 缓冲池可以配置多个(innodb_buffer_pool_instances),每个页根据hash值平均分配到不同的缓冲池实例中,用于减少数据库内部资源竞争
  • LRU List
    • 将最新的页放在队列前端,最近最少使用的放在尾端,当缓冲池不够用时,将尾端的页删除出缓冲池(如果此页是脏页,会先刷新到磁盘)。innodb采用的是midpoint技术进行LRU,具体参看《MySQL技术内幕 InnoDB存储引擎》
  • Flush List
    • 脏页列表
  • 重做日志redolog缓冲
    • 为了防止脏页在刷新到磁盘时宕机,必须先redolog,再修改页;
    • 数据库发生宕机时,通过redolog完成数据的恢复(ACID-D持久性
    • 默认大小8M,通过innodb_log_buffer_size
    • 将redolog缓冲刷新到redolog文件中的时机
      • master会将redolog缓冲每隔1s刷新到redolog文件中
      • 每个事物提交
      • redolog缓冲池剩余空间小于1/2
  • Checkpoint
    • 缓冲池不够用时,将脏页刷新到磁盘
    • 数据库宕机时,只需要重做Checkpoint之后的日志,缩短数据库的恢复时间
    • redolog不可用时,将脏页刷新到磁盘

 

四、InnoDB逻辑存储结构

1、表空间

  • 默认情况下,只有一个表空间ibdata1,所有数据存放在这个空间内
  • 如果启用了innodb_file_per_table,则每张表内的数据可以单独放到一个表空间内
    • 每个表空间只存放数据、索引和InsertBuffer Bitmap页,其他数据还在ibdata1中

2、Segment段(InnoDB引擎自己控制)

  • 数据段:B+ tree的叶子节点
  • 索引段:B+ tree的非叶子节点
  • 回滚段

3、Extent区

  • 每个区的大小为1M,页大小为16KB,即一个区一共有64个连续的页(区的大小不可调节,页可以)

4、Page页

  • InnoDB磁盘管理的最小单位
  • 默认每个页大小为16KB,可以通过innodb_page_size来设置(4/8/16K)
  • 每个页最多存放7992行数据

5、Row行

 

五、索引

1、hash索引

  • 定位数据只需要一次查找,O(1)
  • 自适应hash索引:InnoDB会监控对表上各个索引页的查询,如果观察到建立hash索引可以带来速度提升,则建立hash索引(即InnoDB会自动的根据访问频率和模式来自动的为某些热点页建立hash索引)
  • 默认是开启的
  • 只可用于等值查询,不可用于范围查询

2、B+树索引

  • 树的高度一般为2~4层,需要2~4次查询(100w和1000w行数据,如果B+ tree都是3层,那么查询效率是一样的)
  • B+树索引能查到的是数据行所在的页
  • 包含聚集索引和辅助索引

3、聚集索引

  • 即主键索引
  • 叶子节点存放的是行记录数据所在的页,而页中的每一行都是完整的行(叶子节点也被称为数据页)
  • 针对范围查询也比较快

聚集索引图:

其中,根节点部分的Key:80000001代表主键为1;Pointer:0004代表指向数据页的页号(即第4页);

数据页节点的的PageOffset:0004代表第4页,其中存储的数据是完整的每一行。

 

4、辅助索引

  • 叶子节点存放的也是行记录数据所在的页,但还是页中存放的不是完整的行,而是仅仅是一对key-value和一个指针,该指针指向相应行数据的聚集索引的主键
  • 假设辅助索引树高3层,聚集索引树为3层,那么根据辅助索引查找数据,需要先经过3次IO找到主键,再经过3次IO找到行做在的数据页
  • 针对辅助索引的插入和更新操作:辅助索引页如果在缓冲池中,则插入;若不在,则点放到InsertBuffer对象中,之后在以一定的平率进行InsertBuffer和辅助索引页子节点的合并

辅助索引图:

其中,idx_c表示对第c列做了索引;idx_c中的Key:7fffffff代表c列的一个值,其实是-1;idx_c中的Pointer:80000001代表该行的主键是80000001,即1;下面的就是聚集索引部分。

 

5、联合索引(多列索引)

  • 左边匹配原则(如果索引为(a,b),则where a=x可以用到索引,但是b=x用不到,如果是覆盖索引有可能会用到)

6、覆盖索引

  • 从辅助索引中直接获取记录
  • 对于统计操作,例如count(1),有可能联合索引,右边也会匹配(优化器自己会做),因为count(1)操作不需要获取整行的详细数据,所以不需要去聚集索引的叶子节点去获取数据,直接在辅助索引树中就完成了操作
  • select username from xxx where username=\'lisi\',如果username是辅助索引,那么整个查询在辅助索引树上就可以完成,因为辅助索引树上虽然没有保存完整的行,但是保存着<username,lisi>这个key-value对;如果select username, age from xxx where username=\'lisi\',那么就要走聚集索引了

 

六、锁

1、latch

  • 保证并发线程操作临界资源的正确性
  • 自旋锁,自旋指定的次数后,若还没获取到锁,则进入等待状态,等待被唤醒

2、lock

  • 事务锁,锁定的可能是表、页或行
  • 释放点:事务commit或rollback
  • 两种标准的行级锁
    • 共享锁:S lock,事务T1获取了r行的S锁,事务T2也可以获取r行的S锁
    • 排他锁:X lock,事务T1获取了r行的S锁,事务T2就不能获取r行的X锁;事务T1获取了r行的X锁,事务T2就不能获取r行的X/S锁

七、事务

1、隔离级别

  • 读不提交
  • 读并且提交
    • 可避免脏读:一个事务读到另一个事务没有提交的数据,如果另一个事务发生回滚,第一个事务读到的数据就是垃圾数据
  • 可重复读
    • 会有幻读,InnoDB通过Next-Key Lock解决了
      • 幻读:指两次执行同一条 select 语句会出现不同的结果,第二次读会增加一数据行,并没有说这两次执行是在同一个事务中。使用表锁即可避免。
    • 可避免不可重复读:在同一个事务中两条一模一样的 select 语句的执行结果的比较。如果前后执行的结果一样,则是可重复读;如果前后的结果可以不一样,则是不可重复读。通常是发生了update。增加读取时的共享锁(禁止修改)即可避免。
    • 默认的事务隔离级别
  • 序列化

这里有美团的一篇文章,非常好:http://tech.meituan.com/mysql-index.html

补充:摘自:https://tech.meituan.com/mysql-index.html

一、B+树结构:

二、从B+树查找数据流程

三、B+树性质

 

以上是关于MySQL技术内幕:InnoDB存储引擎的目录的主要内容,如果未能解决你的问题,请参考以下文章

《mysql技术内幕 InnoDB存储引擎(第二版)》阅读笔记

MySQL技术内幕 InnoDB存储引擎 之 InnoDB体系架构

《MySQL技术内幕InnoDB存储引擎》读书笔记 第一章

(转)Mysql技术内幕InnoDB存储引擎-表&索引算法和锁

《MySQL技术内幕 InnoDB存储引擎》一书中用于查看数据页内容的python小工具

MySQL技术内幕(SQL编程)-数据类型