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

一、mysql架构

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

 

老二、存储引擎

InnoDB:

  • 支撑工作
  • 行锁
  • 读操作无锁
  • 4种隔离级别,默认为repeatable
  • 自适应hash索引
  • 诸张表的贮存都是据主键的顺序记性存放
  • 支撑全文索引(InnoDB1.2.x – mysql5.6)
  • 支持MVCC(多本子出现控制)实现高并发

MyISAM:

  • 匪支持工作
  • 表锁
  • 支持全文索引

 

其三、InnoDB体系架构

MySQL 1

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逻辑存储结构

MySQL 2

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页,其中蕴藏的数据是总体的各国一行。

MySQL 3

 

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;下面的尽管是聚集索引部分。

MySQL 4

 

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。增加读取时的共享锁(禁止修改)即可避免。
    • 默认的工作隔离级别
  • 序列化

此出美团的同样首MySQL文章,非常好:http://tech.meituan.com/mysql-index.html

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

一、B+树结构:

MySQL 5

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

MySQL 6

三、B+树性质

MySQL 7

 

网站地图xml地图