当前位置: 首页 > news >正文

沈阳网站建设58同城邯郸 平面设计

沈阳网站建设58同城,邯郸 平面设计,搜索引擎营销优化诊断训练,海南省建设设厅官方网站前言 ​ 在应用系统中#xff0c;为加速数据访问#xff0c;会把高频的数据放在「缓存」(Redis、MongoDB)里#xff0c;减轻数据库的压力。在操作系统中#xff0c;为了减少磁盘IO#xff0c;同时为了快速响应#xff0c;引入了「缓冲池」(buffer pool)机制。 ​ MySQL…前言 ​ 在应用系统中为加速数据访问会把高频的数据放在「缓存」(Redis、MongoDB)里减轻数据库的压力。在操作系统中为了减少磁盘IO同时为了快速响应引入了「缓冲池」(buffer pool)机制。 ​ MySQL作为一个存储系统为提高性能减少磁盘IO同样具有「缓冲池」(buffer pool)机制。 介绍 ​ Buffer Pool作为InnoDB内存结构的四大组件之一是InnoDB存储引擎层的缓冲池。Buffer Pool以Page页为单位缓存最热的数据页(data page)与索引页(index page)Page页默认大小16KBP的底层采用链表数据结构管理Page。 ​ Buffer Pool默认大小 128M。 ​ Buffer Pool 除了缓存「索引页」和「数据页」还包括日志缓存 log buffer undo 页 、redo log插入缓存、自适应哈希索引、锁信息等。 ​ 也就是说所有数据页的读写操作都需要通过buffer pool进行innodb 读操作先从buffer_pool中查看数据的数据页是否存在如果不存在则将page从磁盘读取到buffer pool中。innodb 写操作先把数据和日志写入 buffer pool 和 log buffer再由后台线程以一定频率将 buffer 中的内容刷到磁盘「这个刷盘机制叫做Checkpoint」。 ​ 写操作的事务持久性由redo log 落盘保证buffer pool只是为了提高读写效率。 Buffer Pool控制块 ​ 为了更好管理的缓存页Buffer Pool有一个「描述数据的区域」叫控制块。InnoDB 为每一个缓存的数据页都创建了一个单独的区域记录的数据页的元数据信息包括数据页所属表空间、数据页编号、缓存页在Buffer Pool中的地址链表节点信息、一些锁信息以及 LSN 信息等。 ​ 「控制块和缓存页是一一对应的它们都被存放到 Buffer Pool 中其中控制块被存放到 Buffer Pool 的前边缓存页被存放到 Buffer Pool 后边」控制块大概占缓存页大小的5%16 * 1024 * 0.05 819个字节左右。 ​ 但是需要注意的是一般数据页虽然有默认大小但是有的数据页会超出大小如果剩余空间不够一堆控制块和缓冲页那么就部分空间就属于碎片空间。 Buffer Pool的管理 ​ Buffer Pool里有三个链表LRU链表free链表flush链表InnoDB正是通过这三个链表的使用来控制数据页的更新与淘汰的」。 1、Buffer Pool的初始化 ​ 当启动 Mysql 服务器的时候需要完成对 Buffer Pool 的初始化过程即分配 Buffer Pool 的内存空间把它划分为若干对控制块和缓存页。 ​ 划分空间后Buffer Pool的缓存页是都是空的当要对数据执行增删改查的操作的时候才会把数据对应的页从磁盘文件里读取出来放入Buffer Pool中的缓存页中。当BufferPool中间有的页数据持久化到硬盘后这些数据页又会被空闲出来。 「申请空间」 Mysql 服务器启动就会根据设置的Buffer Pool大小innodb_buffer_pool_size超出一些去操作系统「申请一块连续内存区域」作为Buffer Pool的内存区域。「划分空间」 当内存区域申请完毕之后数据库就会按照默认的缓存页的16KB的大小以及对应的800个字节左右的控制块的大小在Buffer Pool中划分**「成若干个【控制块缓冲页】对」**。 2、Free链表 ​ Free链表即空闲链表是一个双向链表由一个基础节点和若干个子节点组成记录空闲的数据页对应的控制块信息。说白了Free链表的设计是为了找到空闲的缓存页。 1节点信息 「基节点」 ​ 基础节点是一块单独申请的内存空间约占40字节。并不在Buffer Pool的连续内存空间里。基础节点会引用链表的头节点和尾节点。 「子节点」 ​ 每个子节点就是个空闲缓存页的控制块的地址信息也就是说只要一个缓存页空闲那它的控制块就会被放入free链表。每个控制块块里都有两个指针free_pre指向上一个节点free_next指向下一个节点。 磁盘页加载到BufferPool的缓冲池流程 从free链表中获取头节点取出一个空闲的控制块以及对应缓冲页把磁盘上的数据页读取到对应的缓存页同时把相关的一些描述数据写入缓存页的控制块例如页所在的表空间、页号之类的信息把该控制块对应的free链表节点从链表中移除表示该缓冲页已经被使用了 2如何确定数据页是否被缓存 ​ 数据库提供了一个数据页缓存哈希表以表空间号数据页号作为key缓存页的控制块地址作为value。 ​ 也就是说如果要使用缓冲页就会先去数据页缓冲哈希表中查找表中存在的话再根据控制块的地址去找缓冲页如果没找到缓冲页那么就会先读取数据页数据从空闲列表中获取空闲的缓冲页就行写入写入完毕之后移出空闲链表并更新控制块的地址信息。 大致过程 通过sql语句中的数据库名和表名可以知道要加载的数据页处于哪个表空间。「根据表空间号、表名称本身通过一致性算法得到索引根节点数据页号」。进而根据根节点的数据页号通过Btree一层一层往下找最后找到想要的数据页再从数据页缓存哈希表得到对应缓存页地址。通过缓存页地址就可以在Buffer Pool池中定位到缓存页。 3、LRU链表 ​ 当free链表的所有子节点都没有但是Buffer pool的大小是固定的就会从LRU链表中获取相对非热点数据的节点来做数据覆盖。 ​ 基于此InnoBD采用了LRULeast recently used算法将频繁访问的数据放在链表头部而不怎么访问的数据链表末尾空间不够的时候就从尾部开始淘汰从而腾出空间。 ​ LRU算法的目的就是为让被访问的缓存页能够尽量排到靠前的位置。LRU链表本质上也是有控制块组成的。 ​ 当数据库从磁盘加载一个数据页到Buffer Pool中的时候会将一些变动信息也写到控制块中并且将控制块从Free链表中脱离加入到LRU链表中。 ​ 当访问的页在 Buffer Pool 里就将该页对应的控制块移动到 LRU 链表的头部节点。 ​ 当访问的页不在 Buffer Pool 里除了要把控制块放入到 LRU 链表的头部还要淘汰 LRU 链表末尾的节点。 LRU链表区域划分 ​ LRU链表是Msyql 基于 LRU 设计了冷热数据分离的处理方案分为young区域和old区域young区域位于链表头部5/8存放热点数据。old区域位于链表尾部3/8存放非热点数据。 存放规则 ​ **每次有数据被加载到buffer pool后先插入到old区域的头部并标记第一次访问的时间后续如果在访问到当前页并且访问时间间隔大于设置的间隔时间innodb_old_blocks_time默认1s才会把当前页给提高到young区域。**通过这种方式就避免了全部扫描导致的只访问一次的数据页覆盖掉热点数据的问题。 ​ 但是热点区域的数据被频繁访问如果young区域每次访问某一页就把当前页移动到young区域的head会导致LRU链表频繁的变形因此mysql又做了一个优化young区域前1/4被访问不会被移动到头部只有后面的3/4被访问才会移动到头部。 4、Flush链表 ​ 对数据的读写都是先对Buffer Pool中的缓存页进行操作然后在通过后台线程将脏页写入到磁盘持久化到磁盘中即刷脏。 ​ 脏页当执行写入操作时先更新的是缓存页此时缓存页跟磁盘页的数据就会不一致这就是常说的脏页 ​ Flush链表与Free链表的结构很类似也由基节点与子节点组成。Flush链表是一个双向链表链表节点是被修改过的缓存页对应的控制块。Flush链表作用帮助定位脏页需要刷盘的缓存页。 基节点和free链表一样连接首尾结点并记录存储了有多少个描述信息块。 子节点每个节点是脏页对应的控制块即只要一个缓存页被修改那它的控制块就会被放入Flush链表每个控制块块里都有两个指针pre指向上一个节点next指向下一个节点 写入过程 更新Buffer Pool中的数据页一次内存操作将更新操作顺序写Redo log一次磁盘顺序写操作顺序写Redo log每秒几万次 其他 1、Change Buffer 写缓存 ​ 在MySQL5.5之前叫插入缓冲Insert Buffer只针对INSERT做了优化现在对DELETE和UPDATE也有效叫做写缓冲Change Buffer。 ​ **它是一种应用在非唯一普通索引页non-unique secondary index page不在缓冲池中对页进行了写操作并不会立刻将磁盘页加载到缓冲池而仅仅记录缓冲变更Buffer Changes等未来数据被读取时再将数据合并Merge恢复到缓冲池中的技术。**写缓冲的目的是降低写操作的磁盘IO提升数据库性能。 1数据修改操作的步骤 第一步修改一条数据时首先判断该条数据是否存在于Buffer Pool之中。 如果在直接修改Buffer Pool中的相关数据。如果不在首先在磁盘中读取该条数据到Change Buffer之中而后在Change Buffer中修改该数据同时写入Redo Log之中为了防止数据丢失等下一次查询该条数据时合并至Buffer Pool中。 第二步Change Buffer中数据修改之后什么时候合并数据呢 第一种方式当修改的这条数据被查询的时候合并到Buffer Pool。第二种方式MySQL 数据库中的Master Thread合并周期默认10s。第三种方式当 MySQL 数据库关闭时通过Redo Log合并到磁盘中。 2change buffer 只适用于非唯一普通索引页? ​ **如果索引设置了唯一属性在进行修改操作的时候innodb必须进行唯一性检查也就是说即便索引页不在缓冲池中磁盘的读取也是不可避免的。**此时就应该直接把相应的页放入缓冲池然后进行修改而没有必要进行“写缓冲”这多余操作。 3change buffer中数据刷新的触发时机 相关数据页被访问后台线程在数据库空闲时数据库缓冲池不够用数据库正常关闭redo log写满 2、Log Buffer 日志缓冲 ​ 日志缓冲区Log Buffer是MySQL中用于存储事务日志Transaction Log的缓冲区。它在数据库执行事务时起到关键的作用。 ​ 当在MySQL中对InnoDB表进行更改时这些更改首先存储在InnoDB日志缓冲区的内存中然后写入通常称为重做日志redo logs的InnoDB日志文件中。redo日志缓冲区是内存存储区域用于保存要写入磁盘上的日志文件的数据。日志缓冲区大小由innodb_log_buffer_size 变量定义默认大小为16MB。 ​ 日志缓冲区的内容定期刷新到磁盘。较大的日志缓冲区可以运行大型事务而无需在事务提交之前将重做日志数据写入磁盘。因此如果有更新插入或删除许多行的事务则增加日志缓冲区的大小可以节省磁盘I/O。 ​ MySQL 数据库在系统磁盘上保存的数据是有序的典型就是按照主键 ID如果每一次修改数据直接操作磁盘的话会导致很多数据的位置发生更改也就是我们常说的随机 IO但是Redo log中保存的数据是有序的(顺序IO)不会产生随机 IO所以使用Redo log暂时保存数据是确保数据不丢失时的最好办法。 3、Doublewrite Buffer 双写缓冲 ​ 一般情况下Linux文件系统的页大小是4KB而我们知道 mysql的页大小为16KBoracle为8KB这就说明mysql将buffer pool中的一页数据刷到磁盘里面需要写4个文件系统页。 ​ 但是这个操作并不是原子性的如果写到一半断电就会发生“页数据损坏”。 ​ Doublewrite Buffer又名双写缓冲区是内存磁盘结构内存结构是由128个页组成大小为16KB × 128 2MB“Double”的由来是因为数据写两次磁盘一次是写DWB的内存区域此过程分两次写入每次写入16KB × 64 1MB的数据会分两次刷入磁盘一次是直接写入Data File.ibd。 ​ MySQL 8.0较MySQL 5.6、5.7版本的Doublewrite Buffer产生了一些新的变化DWB磁盘结构的数据存放从共享系统表空间中分离出来存放在单独的.dblwr文件中 如何修复页数据损坏 ​ 采用double write buffer 来进行修复Doublewrite Buffer是为了保证因系统页损坏导致的MySQL数据丢失的保证方案。redo log无法修复这类页数据损坏异常。修复的前提是页数据正确并且redo日志正常。 double write buffer 和传统的buffer不同它分为内存和磁盘两层架构。 工作流程如下刷盘 页数据先通过memcpy函数拷贝至内存中的Doublewrite Buffer中Doublewrite Buffer的内存里的数据页会fsync刷到Doublewrite Buffer的磁盘上分两次写入磁盘共享表空间中(连续存储顺序写性能很高)每次写1MBDoublewrite Buffer的内存里的数据页再刷到数据磁盘存储.ibd文件上离散写 两次磁盘写会不会影响性能 内存copy到DWB的内存区域速度很快DWB的内存写到DWB的磁盘属于顺序追加写速度也快刷磁盘随机写但是本来就需要进行。另外128页工2M的DWB会分两次刷入磁盘每次最多64页数据量小执行快因此综合来看虽然性能有影响但是影响不大。 小结 ​ InnoDB Doublewrite Buffer是InnoDB的一个重要特性用于保证MySQL数据的可靠性和一致性。它的实现原理是通过将要写入磁盘的数据先写入到Doublewrite Buffer中的内存缓存区域然后再写入到磁盘的两个不同位置来避免由于磁盘损坏等因素导致数据丢失或不一致的问题。 疑问 1、MySQL 是怎么判断脏页的 脏页的控制块同时存在于 LRU 链表和 Flush 链表。 2、触发刷脏页的条件 1redo log快写满的时候 2为了保证MySQL中的空闲页面的数量Page Cleaner线程会从LRU 链表尾部淘汰一部分页面作为空闲页。如果对应的页面是脏页的话就需要先将页面Flush到磁盘。 3MySQL中脏页太多的时候。innodb_max_dirty_pages_pct 表示的是Buffer Pool最大的脏页比例默认值是75%当脏页比例大于这个值时会强制进行刷脏页保证系统有足够可用的Free Page。 4MySQL实例正常关闭的时候也会触发MySQL把内存里面的脏页全部刷新到磁盘。 总结 ​ Buffer Pool 里有三种数据页页和链表来管理数据Free Page空闲页、Clean Page干净页、Dirty Page脏页。 ​ Free Page空闲页。表示此数据页未被使用是空的其控制块位于 Free 链表 ​ Clean Page干净页。表示此数据页已被使用缓存了数据 其控制块位于LRU 链表。 ​ **Dirty Page脏页。表示此数据页【已被使用】且【已经被修改】数据页中数据和磁盘上的数据已经不一致。脏页的控制块同时存在于 LRU 链表和 Flush 链表。**当脏页上的数据写入磁盘后内存数据和磁盘数据一致那么该页就变成了干净页。 ​
http://www.yayakq.cn/news/3350/

相关文章:

  • 发帖效果好的网站百度信息流怎么做效果好
  • 建设部网站施工合同app开发软件要多少钱
  • 手机网站用什么做产品外观设计案例
  • 石家庄网站制作软件公众号登录微信公众号登录
  • 聊城网站制作价格网站开发h5页面
  • 怎么做平台网站吗婚庆公司网站
  • 公司免费网站制作高质量的南昌网站建设
  • 获取网站域名响应式网站开发哪家好
  • 开源零代码开发平台搜索引擎seo如何优化
  • 房产网站内容建设部门规划怎样与知名网站做友情链接
  • 深圳网站关键词排名优化主题 外贸网站 模板下载
  • wordpress怎么生成app资阳seo优化公司
  • 自定义建设网站南宁网站建设公司哪家好
  • 镇江网站seo公司做企业网站大约多少钱
  • 山东爱易网站建设工作室阿迪达斯网站建设的总体目标
  • 简单的网站设计多少钱wordpress网站弹窗插件
  • 网站建设维护招聘做网站分辨率多少钱
  • 学习怎样建网站网站开发技术课程设计总结
  • 东莞优化seo网站关键词优化信阳市住房和城乡建设厅网站
  • wordpress+手机站目录浪琴官网
  • 商城网站建设哪家便宜会展设计师资格证
  • 成都建设网站高级工程师查询信阳网站seo
  • 建什么网站能百度收录网站首页布局设计教程
  • 在家做农业关注什么网站不动产登记网站建设
  • 制作招商加盟网站校园网站规划与建设心得
  • 太原网站排名公司wordpress 数据库 开发
  • 建设济南公司网站常州公司做网站
  • 沧州市东光建设局 网站网站的内链
  • 北京网站开发外包公司九江便宜做网站
  • 佛山营销网站建设多少钱psd网站首页图片