zoukankan      html  css  js  c++  java
  • Mysql 笔记二

    Mysql 笔记二

    Mysql 笔记二

    1 前言

    2 Master Thread 工作方式

    Master Thread是最高级别的线程,控制着内存的管理

    2.1 主循环(loop)

    loop循环是主要的循环,大多操作是在这个循环中完成的,有两大操作:每秒操作和每10秒操作

    • 每一秒操作
      • 日志缓冲刷新到磁盘(总是)
      • 合并插入缓冲(可能)
      • 至多刷新100个InnoDB缓冲池中的脏页(可能)
      • 如果当前没有用户活动,切换到backgroup loop
    • 每十秒操作
      • 刷新100个脏页到磁盘(可能)
      • 合并最多5个插入缓冲(总是)
      • 将日志刷新到磁盘(总是)
      • 删除无用undo页(总是)
      • 刷新100个或者10个脏页到磁盘(总是)

    2.2 后台循(backgroup loop)

    • 删除无用的Undo页 (总是 )
    • 合并20个插入缓冲 (总是)
    • 跳到主循环(总是)
    • 不断刷新100个页直到符合条件(可能)

    2.3 刷新循环(flush loop)

    2.4 暂停循环(suspend loop)

    3 InnoDB关键特性

     

    3.1 插入缓冲(Insert Buffer)

    • 运用插入缓冲的两个条件:
      • 索引是辅助索引(Secondary index)
      • 索引不是唯一的(Unique)
    • 聚集索引、非聚集索引
    • 对于非聚集索引的更新中,因为要离散寻找,所以会比较慢。所以Insert Buffer做的操作是:
      • 先判断插入的非聚集引页是否在缓存池中,在,则直接插入
      • 不在,则先放一个Insert Buffer
      • 再以一定频率进行Insert Buffer和辅助引页子节点合并

    这通常能将多个插入合并到一个操作中,大大提高了非聚集引插入的性能 用命令可查看:

     mysql> show engine innodb statusG;
     *************************** 1. row ***************************
    Type: InnoDB
    Name: 
    Status: 
    =====================================
    141027 21:38:14 INNODB MONITOR OUTPUT
    =====================================
    Per second averages calculated from the last 8 seconds
    -----------------
    .....
    -------------------------------------
    INSERT BUFFER AND ADAPTIVE HASH INDEX
    -------------------------------------
    Ibuf: size 1, free list len 0, seg size 2, 0 merges
    merged operations:
    insert 0, delete mark 0, delete 0
    discarded operations:
    insert 0, delete mark 0, delete 0
    Hash table size 276707, node heap has 0 buffer(s)
    0.00 hash searches/s, 0.00 non-hash searches/s
    

    3.2 两次写(Double Write)

    • why Double Write 当发生宕机时,有些页是16K的,可能只写了8K,导致了部分失效。重做日志是针对页来说的,如果这个页本来就已经失效了,重做也没意义。所以发生这种情况,我们一个页的副本来还原该页,再重做。这就是Double Write
    • Double Write 架构 22664653_1397306356fmMx.jpg double write由两部分组成,一部分是内存中的double write buffer,大小为2M,另一部分是物理磁盘上共享表空间的2个区,同样为2M。对缓冲池的脏页进行刷新时,并不直接写磁盘,而是先将脏页复制到内存中的double write buffer,之后通过doublewrite buffer再分两次,每次1M顺序地定入共享表空间的物理磁盘,再马上同步磁盘。 观察命令:
    mysql> show global status like 'innodb_dblwr%'G;
    *************************** 1. row ***************************
    			 Variable_name: Innodb_dblwr_pages_written
    			 Value: 0
    *************************** 2. row ***************************
    			 Variable_name: Innodb_dblwr_writes
    			 Value: 0
    			 2 rows in set (0.00 sec)
    

    3.3 自适应哈希索引(Adaptive Hash Index),默认开启

    • what is AHI InnoDB存储引擎会监控对表上各索引页的查询,如果观察到建立哈希索引可以带来速度提升,则建立哈希索引。AHI 是通过缓冲池的B=树页构造,建立速度很快
    • AHI要求
      • 对页的连续访问模式是一样的。访问模式一样指的是查询条件一样
      • 以该模式访问了100次
      • 页通过该模式访问了N次,其中N=页中记录*1/16

    3.4 异步IO(Async IO)

    没什么好说的,异步的好处不用说

    3.5 刷新邻接页(Flush Neighbor Page)

    当刷新一个脏页时,检测该页所在的区的所有页,如果是脏页,一起刷。

    4 Mysql 启动、关闭、恢复

     

    4.1 innodb _fast _shutdown

    在关闭时,参数innodb _fast _shutdown影响行为,参数可取值0、1、2,默认为1

    • 0:表示MYSQL关闭时,要完成所有的full purge的merge insert buffer,刷新所有的脏页。如果对 MySQL升级,这个参数必须调0
    • 1:默认值,不完成full purge和merge insert buffer,在缓冲池中的一些数据脏页还是会刷新回磁盘
    • 2:不完成 full purge ,merge insert buffer,也不刷新缓冲池,而是将日志都写入日志文件,下次启动进行恢复操作(recovery)

    4.2 innodb _force Srecovery

    影响恢复情况,默认为0

    • 1:忽略检查到的corrupt页
    • 2:阻止Master Thread运行
    • 3:不进行事务的回滚操作
    • 4:不进行插入缓冲的合并操作
    • 5:不查看撤销日志,装未提交的事务视为已提交
    • 6:不进行前滚操作

    Date: <2014-10-28 周二>

    Author: eqyun

    Created: 2014-10-28 周二 13:25

    Emacs 24.3.1 (Org mode 8.2.10)

    Validate

  • 相关阅读:
    如何配置mysql的超时时间
    什么是P2P流标
    为何农历10月1号要祭祖上坟?原来有这么多讲究,你知道吗?
    “请家堂”的旧习俗不是封建迷信
    sourcetree合并分支
    mybatis sql参考
    source tree使用经验
    关于 early Z 与 z-prepass
    发现一个好工具RenderDoc
    HASHSET不能预留容量问题
  • 原文地址:https://www.cnblogs.com/ultrazb/p/4056616.html
Copyright © 2011-2022 走看看