• Innodb学习


    INNODB整体学习
    1 内存结构
      组成部分:
      缓冲池   buffer pool, 由innodb_buffer_pool_size配置
      重做日志缓冲池 redo log buffer, 由innodb_log_buffer_size配置
      额外内存池  additional memory pool, 由innodb_additional_mem_pool_size配置
    1.1 buffer pool
      是占最大块内存的部分,用来存放各种数据的缓存;
      innodb将数据库文件按页(16K)读取到缓冲池,然后按最少使用(LRU)算法来保留缓存数据;数据文件修改时,先修改缓存池中的页(即脏页),然后按一定频率将脏页刷新到文件;
      缓冲池中的数据页类型有:
      索引页、数据页、undo页、插入缓冲(insert buffer)、自适应哈希索引(adaptive hash index)、锁信息(lock info)、数据字典信息(data dictionary)
      查看buffer pool的使用情况
      show engine innodb statusG
      结果示例:
    =====================================
    120610 18:31:49 INNODB MONITOR OUTPUT
    =====================================
    Per second averages calculated from the last 44 seconds
    ...
    ----------------------
    BUFFER POOL AND MEMORY
    ----------------------
    Total memory allocated 53657600; in additional pool allocated 0
    Dictionary memory allocated 39802
    Buffer pool size   3200
    Free buffers       2790
    Database pages     409
    Old database pages 0
    Modified db pages  0
    Pending reads 0
    Pending writes: LRU 0, flush list 0, single page 0
    Pages made young 0, not young 0
    0.00 youngs/s, 0.00 non-youngs/s
    Pages read 409, created 0, written 4
    0.09 reads/s, 0.00 creates/s, 0.09 writes/s
    Buffer pool hit rate 998 / 1000, young-making rate 0 / 1000 not 0 / 1000
    Pages read ahead 0.00/s, evicted without access 0.00/s
    LRU len: 409, unzip_LRU len: 0
    I/O sum[0]:cur[0], unzip sum[0]:cur[0]
    ...
      分析
      (1)Per second averages calculated from the last 44 seconds
      show engine innodb status 显示的过去某个时间段内的使用情况
      (2)Total memory allocated 53657600; in additional pool allocated 0
      当前分配的memory大小和additional pool大小,单位byte
      (3)接下来的pool中各项占的大小
      Dictionary memory allocated 39802  数据字典内存区大小,单位byte
      Buffer pool size   3200    总页数, 3200*16/1024=50M
      Free buffers       2790    空闲的页数, 2790*16/1024=43M
      Database pages     409    已使用的缓冲页数, 409*16/1024=6.3M
      Old database pages 0     
      Modified db pages  0     表示脏页数
    1.2 log buffer
      作用
      将重做日志先放入这个区,然后按一定频率将其刷新至重做日志文件,一般情况下每1秒就会刷新一次;
      配置
      一般不需配置很大;
    1.3 额外内存池
      作用:
      innodb申请缓冲池(buffer pool),但每个缓冲池中的页缓冲有对应的缓冲控制对象(buffer control block),这些对象记录LRU、锁、等待等信息,这些对象的内存需要多额外内存池中申请;因此当buffer pool较大时,也需相应增大该值
    ====================================
    2 innodb的后台线程
      默认情况下,innodb有以下几类线程:
      io thread,分为read thread和write thread;
      master thread,1个
      lock monit thread,1个
      error monit thread,1个
    3 io thread
      包括以下几种:
      read thread
      write thread
      insert buffer thread
      log thread
      配置设置:
      read thread和write thread分别由innodb_read_io_threads和innodb_write_io_threads来配置;
      log thread和insert buffer thread一般是1个;
      查看
      show variables like '%threads%';
      show engine innodb statusG
    4 master thread
      完成的工作
      主循环 loop
      后台循环 background loop
      刷新循环 flush loop
      暂停循环 suspend loop
    4.1 主循环 loop
      该循环中完成的有两种操作,每秒一次的操作和每10秒一次的操作
      每秒一次的操作:
      a)日志缓冲刷新到磁盘,即使这个事务未提交(总是);
      b)合并插入缓冲(可能),会根据前一秒内的io次数判断,如果小于5次,可以执行合并插入缓冲;
      c)至多刷新100个脏页至磁盘(可能),通过判断脏页比例是否超过了innodb_max_dirty_pages_pct这个设置值来进行,未超过则不执行;
      d)无用户活动,切换到background loop(可能);
     
      每10秒一次的操作:
      a)刷新100个脏页到磁盘(可能),如果过去10秒磁盘io操作小于200次,则执行本操作;
      b)合并至多5个插入缓冲(总是);
      c)日志缓冲刷新到磁盘(总是);
      d)删除无用的undo页(总是);
      e)刷新100个或10个脏页到磁盘(总是),判断缓冲池脏页比例,超过70%则刷新100个脏页,比例小于10%则刷新10个脏页;
      f)产生一个检查点checkpoint(总是),注意此时并不是把所有脏页都刷新到了磁盘,只是将最老日志序列号的页写入磁盘;
    4.2 后台循环 background loop
      当没有用户活动或数据库关闭时,会切换到这个循环;
      完成的操作
      a)删除无用的undo页(总是);
      b)合并20个插入缓冲(总是);
      c)跳回到主循环(总是);
      d)不断刷新100个页,直到符合条件(可能,跳转到flush loop中完成);
    4.3 flush loop
      由background loop跳转到此loop中完成刷新脏页的工作;
      当flush loop中无事可做时会切换到suspend loop;
    4.4 suspend loop
      该loop将master thread挂起,等待事件发生;在启用了innodb引擎,但未使用innodb表时,master thread总是处于挂起状态;
    4.5 查看示例
      show engine innodb statusG
    -----------------
    BACKGROUND THREAD
    -----------------
    srv_master_thread loops: 4 1_second, 4 sleeps, 0 10_second, 6 background, 6 flush
    srv_master_thread log flush and writes: 4
      说明
      (1)主循环,每秒一次的操作有4次,每10秒一次的操作有0次;一般这两个比例在1:10时较合理;
  • 相关阅读:
    Linux部署Spingboot项目
    Linux Centos7yum安装Mysql8.0.21
    Linux配置网络yum源,提高下载速度
    Linux安装jdk1.8
    Spring的AOP
    Spring的事务管理
    Maven项目中,使用mybatis,根据数据库自动生成pojo实体类、dao、mapper
    Ubuntu14.04中使用docker容器部署tomcat镜像+java web项目
    mybatis
    spl
  • 原文地址:https://www.cnblogs.com/llaq/p/9467666.html
Copyright © 2020-2023  润新知