专栏首页DBA随笔Innodb存储引擎的几个小知识点

Innodb存储引擎的几个小知识点

//

Innodb存储引擎的几个小知识点

//

01

innodb_old_blocks_time参数

在Innodb存储引擎中,采用LRU算法来来对热数据进行管理的。关于LRU算法,可以在之前的文章中进行了解:

Innodb对LRU算法进行了改进,从而防止全表扫描等操作,对LRU队列产生影响,这里引入一个参数,innodb_old_blocks_time,该参数用于表示数据页读取到mid位置之后,要等待多久才会加入到LRU队列的热数据端,凭借这个参数,我们可以巧妙的避免大表扫描等操作对热点数据的影响,如下:

set global innodb_old_blocks_time=1000

select * from table...

set global innodb_old_blocks_time=0

如上,先将该参数调成一个比较大的值,是的后续的全表扫描操作的热数据页不会直接转入LRU队列的前端,在执行完毕大查询之后,再将该值改为一个较小的值,从而实现我们想要的效果。

innodb存储引擎本身是多线程模型,因此,后台有多个不同的线程,它们各司其职,互相配合,完成内存池的刷新操作。

02

Checkpoint的分类

今天翻看《MySQL技术内部Innodb存储引擎》一书时,发现书上讲Checkpoint动作分成了下面几类,这里记录下:

其中,sharp checkpoint值得是数据库正常关闭的时候,所有的脏页都需要刷新回磁盘。

fuzzy checkpoint只刷新一部分脏页,而不是所有,这么看来,我们之前理解的checkpoint都指得是fuzzy checkpoint这一类了。

在fuzzy checkpoint中,又分成了4种情况,其中:

master Thread checkpoint是按照一定频率从缓冲池的脏页列表中刷新一定比例的页面到磁盘中,这个过程是异步的,不会对其他操作产生影响;

flush_lru_list checkpoint是因为innodb中始终需要保证LRU列表中有100个左右的空闲数据页可以使用,如果没有,则需要进行checkpoint操作,将LRU列表尾部的数据页移除。

Async/Sync FLush Checkpoint指的是redo log file不可用的情况,需要强制将一些数据页刷新回磁盘,以使得redo log file可以重新循环利用。

Dirty too much,也就是缓冲池中的脏页过多,需要对缓冲池进行刷新到磁盘的处理,一般是在75%的时候出发,当然,我们可以通过参数innodb_max_dirty_pages_pct这个参数来对阈值进行调整。

03

一个MySQL部署错误引出的思考

今天下午在阿里云美国的一个ECS机器上部署MySQL实例,遇到了下面的一个问题:

/usr/local/mysql/bin/mysqld:error while loading shared libraries:libaio.so.1,cannot open shared object file:No such file or directory

当时解决的办法是:

yum -y install libaio

为了弄清楚这个包究竟是干啥的,我查阅了书籍,最后了解到这个库是一个内核级别的异步IO操作库,在编译或者运行MySQL的时候,需要有这个依赖,否则安装部署过程出错。关于它的功能,我举一个例子:

如果我们要访问id=6、7、8的三条记录,假设这三条记录在三个相邻的数据页中,如果使用同步的方法,访问一次,等待结果,那么要进行三次数据页的返回,我们才能得到结果。而一旦启用了异步IO操作,也就是Async IO,那么我们就只需要一次操作,将id=6的数据页取出来,再往后顺延两个数据页,就能够得到id=6、7、8的这三条记录,这样减少了内存和磁盘的交互次数,MySQL的性能也就得到了提升。

除此之外,还查到一个知识点,就是可以通过参数来关闭这个异步IO的功能,如下:

mysql> show variables like "%use_native%";
+-----------------------+-------+
| Variable_name         | Value |
+-----------------------+-------+
| innodb_use_native_aio | OFF   |
+-----------------------+-------+
1 row in set (0.01 sec)

官方测试,启用该参数,数据恢复速度可以提高75%左右。

本文分享自微信公众号 - DBA随笔(gh_acc2bbc0d447),作者:AsiaYe

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-02-26

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • MySQL之my.cnf文件常用参数

    MySQL的配置文件,想必大家都不陌生,今天再来说说配置文件中的一些常用配置,并非最合理的配置,仅供参考,只有了解自己的生产环境,才能根据环境找到最适合...

    AsiaYe
  • 并行复制的一个问题

    这两天遇到了一个问题,就是一个业务的并发量比较高,在进行MySQL的并行复制的时候,经常会遇到sql线程断开的情况,查看错误日志则是说update了一...

    AsiaYe
  • MySQL实际应用的两个案例

    今天早晨,有个业务方提了个需求,是需要把一个表里的字段从date格式直接变成int格式,目的是为了去掉日期格式中间的短横线,类似2019-09-01变...

    AsiaYe
  • 【玩转腾讯云】万物皆可Serverless之使用SCF+COS免费运营微信公众号

    在上一篇《万物皆可Serverless之使用SCF+COS快速开发全栈应用》教程中,

    乂乂又又
  • 并行复制的一个问题

    这两天遇到了一个问题,就是一个业务的并发量比较高,在进行MySQL的并行复制的时候,经常会遇到sql线程断开的情况,查看错误日志则是说update了一...

    AsiaYe
  • 如何为Hue添加自定义Banner

    在用户使用Hue时,如果需要在Hue界面设置一些提示等信息(如:“Hue用户申请及权限放通,请联系xxx”)时。那这是我们可以通过配置在Hue界面添加该提示信息...

    Fayson
  • CentOS7下编译yaml-cpp库

    yml文件和yaml文件是目前比较常用的配置文件,Java中的SpringBoot的application.yml配置使用的就是这种格式,另外诸如nodejs和...

    ccf19881030
  • 开启程序员世界的Hello World

    Hello World一般是程序员学习编程的第一个程序,典型如K&R的the C programming language,一开始讲述C语言编程的时候,就是用这...

    企鹅号小编
  • 比亚迪鸣响汽车芯片第一枪

    近日,国产新能源汽车领域又放出了一个重磅消息。一直默默布局半导体行业的比亚迪一举拿下19亿融资,并称将在合适的时机挂牌上市。长期以来中国半导体严重依赖进口,作为...

    刘旷
  • 为什么你应该学习编程

    “在硅谷,对于每一个产品经理的职位,约莫配有6个工程岗位。” 很多人,从HR专业人员到市场营销专业人员,都在硅谷工作,但硅谷对编程专业人士的需求更多,也更重视这...

    用户1667431

扫码关注云+社区

领取腾讯云代金券