Mysql以内存结构

内存结构

Mysql内存组成能够分为SGA(系统全局)和PGA(程序缓存区)

内存参数配置

SGA内存主要构成

参数 用途
innodb_buffer_pool 用来缓存innodb表的数据,索引,插入缓存,数据字典等信息
innodb_log_buffer 即redo log buffer 事务在内存中的缓冲
query cache 只能缓存静态数据信息,建议生产环境关闭,5.6以后默认是关闭的,query_cache_type设置为off,query_cache_size设置为0,才会生效

PGA内存主要构成

参数 用途
sort_buffer_size 用户sql语句在内存中的临时排序
join_buffer_size 表链接使用,适用于BKA ,该缓存中会保存join字段的数据方便与另一张表进行链接
read_buffer_size 表顺序扫描的缓存,只适用于MyISAM存储引擎
read_rnd_buffer_size mysql随机读取缓存区大小,用户作MRR,MRR优化的目的就是为了减小磁盘的随机访问,对于MySQL的二级索引(非汇集索引)而言,过于随机的回表会形成随机读取过于严重,范围扫描(range access)中MySQL将扫描到的数据存入read_rnd_buffer_size,而后对其按照Primary Key(RowID)排序,而后使用排序好的数据进行顺序回表,由于咱们知道InnoDB中叶子节点数据是按照PRIMARY KEY(ROWID)进行排列的,那么这样就转换随机读取为顺序读取了
tmp_table_size sql语句在排序/分组时没有使用到索引,会使用临时表空间

Buffer状态及其链表结构

page在InnoDB磁盘I/O最小单位,数据都存放在page中,对应到内存中就是一个个buffer.mysql

  • buffer状态sql

    1.freeBuffer:该buufer未被使用数据库

    2.cleanBuffer:内存中的buffer与磁盘中的page的数据一致缓存

    3.dirtyBuffer:内存中的数据还未被刷到磁盘,和磁盘中的数据不一致oop

buffer由chain来管理,也就是链,三种不一样的buffer生出三条链表优化

  • chain链表线程

    1.free list :把free buffer串联起来,使用时不够用,从lru list和flush list中释放出free buffer日志

    2.lru list :把最近少访问到的clean buffer串联起来释放出free buffercode

    3.flush list : 把dirty buffer串联起来方便线程将数据刷新到磁盘,释放更过的free bufferblog

各大刷线线程及其做用

  • 后台线程中主线程-master thread,其内部有4大循环

    1.主循环 loop

操做 描述
每1s操做 1.日志刷新到磁盘,即便事务还没提交,2.刷新脏页到磁盘,3.执行合并插入缓冲操做,4.产生checkpoint,5.清楚无用的table cache,6.当前没有操做切换到background loop
每10s操做 1.日志刷新到磁盘,即便事务还没提交,2.刷新脏页到磁盘,3.执行合并插入缓冲操做,4.产生checkpoint,5.删除无用的undo

2.后台循环 background loop

3.刷新循环 flush loop

4.暂停循环 supsend loop

  • 4大I/O线程

    1.read thread:读请求线程(默认值都是4个,能够适当调大)

    2.write thread:写请求线程(默认值都是4个,能够适当调大)

    3.redo log thread:负责把日志缓冲区的内容刷新到redo log(默认值都是4个,能够适当调大)

    4.changge buffer threD:把插入缓冲区内容刷新到磁盘(默认值都是4个,能够适当调大)

  • 其余线程 1.page clean tread:将脏页刷到缓存中,能够调为多个

    2.purge thread:删除无用的undo页,经过innodb_purge_thread参数调整线程数默认是1个,最大调整为32个

    3.error monitor thread:负责数据库报错的线程

    4.lock monitor thread:负责监控锁的线程

相关文章
相关标签/搜索