原文链接: http://www.cnblogs.com/cenalulu/archive/2013/10/16/3370626.html

前言:最近在阅读Innodb IO相关部分的源代码。在阅读之前一直有个疑问,show global status 中有两个指标innodb_data_reads 和 innodb_data_read。两个计数器仅差一个字母,他们之间的含义到底有何差别呢?本文将通过解析这两个参数的含义,分析Innodb对于磁盘IO相关的一些知识

首先我们来看下MySQL官方文档里对于这两个参数的解释:

The amount of data read since the server was started.

The total number of data reads.

文档对于这两个参数的解释非常暧昧。这里的读是指什么?是从哪里读?磁盘还是内存?甚至连计数器的单位也不知道。

详细解析:

接下来我们从源代码来解析这两个参数。在src/Srv0srv.c中存在对这两个参数和代码变量的映射关系的定义代码,如下:

export_vars.innodb_data_read = srv_data_read;

export_vars.innodb_data_reads = os_n_file_reads;

接着让我们来看下这两个代码变量在哪里进行了累加操作。

srv_data_read 尽有一处代码进行累加操作,buf0file.c 的 _fil_io 函数中,操作如下:

srv_data_read+= len;

从这行可以看出,innodb_data_read中实际存的是从磁盘上进行物理IO的字节数。

os_n_file_reads 也几乎只有一处代码进行累加(其他是windows的sync读这里忽略),在buf0file.c 的 中,操作如下:os_file_pread

os_n_file_reads++;

随后,代码即调用os_aio_array_reserve_slot将IO请求推入 simulated array,再根据wake_later标志位决定是否调用

os_aio_simulated_wake_handler_thread来立即唤醒IO工作队列。从这里也可以看到,innodb_data_reads记录的是innodb对于磁盘发起的读IO请求次数。

看到这里我们就很容易产生一个疑问:既然两个变量都是对磁盘发起的IO的计数器,为什么不直接放在一个函数的相邻行里呢?

回答这个问题,我们就需要对于innodb的simulated-aio和read-ahead算法有一定理解了。

进入到simulated的aio slot array的请求会有两种,一种是通过buf_read_page

过来的普通页的读请求,一种是通过buf_read_ahead_random/linear

过来的预读请求。从innodb的实现来说普通数据页的请求是需要立即返回响应的,所以是同步(sync)IO。而对于预读这样数据并非SQL所需要,仅

是用于提升性能的页读取,这样的IO完全是可以异步的。这两个差异也是导致simulated aio出现的原因。把IO请求推入slot

array后,数据页同步请求立即通知worker thread去os做同步IO。而预读IO请求会不断的推入slot

array直到一次预读所需要的page全部推入slot中,然后再会通知worker thread。此外在worker

thread中,也会判断一个segment的io请求是否相邻连续,如果连续则把这些请求合并后,作为一次OS IO发到下层存储中。

明白了这些也就不难理解为什么计数器要分开在不同的函数中计数了。如果累加都放在 _fil_io中进行,那么 innodb_data_read

= 16K * innodb_data_reads

(这里假设page没有做压缩)。然而在有了异步IO合并这个操作后,实际的innodb_data_reads会少于_fil_io中获得的计数次数。

所以,通过 innodb_data_read /

innodb_data_reads得到的比值也可以推断出一个MySQL实例中顺序IO或者可顺序预读的IO比例。

我们在production环境的服务器上做一个验证:

服务器A:在线用户访问的数据库,猜测随机IO较多

SHOW GLOBAL STATUS LIKE '%innodb_data_read%';

Innodb_data_read 46384854470656

Innodb_data_reads2812101578

每次IO平均读取字节数=16494

服务器B:历史数据统计的数据库,数据内容和服务器A完全一样,猜测顺序IO较多

SHOW GLOBAL STATUS LIKE '%innodb_data_read%';

Innodb_data_read 54835669766144

Innodb_data_reads2604758776

每次IO平均读取字节数=21052

可见顺序IO较多的MySQL的单次IO读取字节数确实要多于一个page的大小,说明IO合并效果明显。

而随机IO较多的MySQL的单词IO读取字节数几乎和一个page大小一致,即16K

最后我们再总结下一些结论:

Innodb_data_read   表示Innodb启动后,从物理磁盘上读取的字节数总和。

Innodb_data_reads 表示Innodb启动后,队伍物理磁盘发起的IO请求次数总和。

Innodb_data_read / Innodb_data_reads 得到的比值,越接近16K说明IO压力越倾向于随机IO,越远离16K说明IO从顺序预读中获得性能提升越多

mysql innodb_data_read_Innodb_data_read 与Innodb_data_reads的区别相关推荐

  1. mysql社区版与cluster 区别_MySQL版本Enterprise/Community/Cluster等版本的区别

    MySQL分为多种版本如Community.Enterprise.Cluster和Workbench等,MySQL不同版本有什么区别?LAMPLNMP分享: MySQL版本区别 ● MySQL Com ...

  2. SQL Server 和 MySql 语法和关键字的区别

    (1)    MySQL的ifnull()函数对应sql的isnull()函数; (2)    mysql的存储过程中变量的定义去掉@; (3)    mysql的每句结束要用";" ...

  3. php里面sql是什么意思,MySQL和SQL是什么?MySQL和SQL之间的区别有哪些

    MySQL和SQL之间的区别有哪些?很多PHP的初学者,对MySQL,MyAdmin和SQL有什么区别并不是很清楚?下面 第一PHP社区 就带领大家来学习一下MySQL和SQL之间的区别.[推荐阅读: ...

  4. oracle数据库跟mysql的区别_关于Oracle数据库与MySQL数据库的几点区别

    Oracle数据库与MySQL数据库的区别是本文我们主要要介绍的内容,接下来我们就开始介绍这部分内容,希望能够对您有所帮助. Oracle与MySQL的区别: 1.在Oracle中用select * ...

  5. MySQL数据库引擎介绍、区别、创建和性能测试的深入分析

    深入理解MySQL的数据库引擎的类型 作者: 字体:[增加 减小] 类型:转载 本篇文章是对MySQL的数据库引擎的类型进行了详细的分析介绍,需要的朋友参考下   你能用的数据库引擎取决于mysql在 ...

  6. MySQL - change 和 modify 的区别

    表描述 MySQL 中 change 和 modify 区别 更改列名 change: alter table 表名 change 旧列名 新列名 类型 只更改列属性 change: alter ta ...

  7. SQL、MySQL与HiveSQL的使用区别ing

    SQL.MySQL与HiveSQL的使用区别 1 查询结果前10条数据 2 返回是周几的函数 3 查看表结构数量 4 获取当前时间 5 从数据库定位到某张表 6 分号字符: 7 IS [NOT] NU ...

  8. mysql 、oracle存储过程语法区别

    mysql .oracle存储过程语法区别 1.  条件语句:mysql使用elseif关键字,oracle是elsif关键字: oracle: if表达式 then 表达式: elsif 表达式: ...

  9. MySQL与Oracle的应用区别

    关系型数据库(Oracle与MySQL优缺点.使用区别) MySQL的特点 1.性能卓越,服务稳定,很少出现异常宕机: 2.开放源代码无版本制约,自主性及使用成本低: 3.历史悠久,社区和用户非常活跃 ...

  10. mysql社区版与cluster 区别_MySQL版本Enterprise/Community/Cluster有何区别

    MySQL版本Enterprise/Community/Cluster有何区别 发布时间:2020-05-28 14:23:34 来源:PHP中文网 阅读:278 作者:三月 下面讲讲关于MySQL版 ...

最新文章

  1. 3D 人体姿态估计简述
  2. matlab中float类型的_【Python基础学习】2. 变量、基本数据类型及其转换
  3. 【风险管理】假如我是风控经理,会搭建怎样的风控团队
  4. 【youcans 的 OpenCV 例程200篇】149. 图像分割之边缘模型
  5. 三维坐标转经纬度_Three.js 地理坐标和三维空间坐标的转换
  6. Highcharts实现图形报表(我主要实现javaweb开发的图形报表)
  7. 解决npm install安装慢的问题
  8. 从零实现深度学习框架——N-Gram语言模型(二)
  9. lycos搜索引擎_Lycos中国推出全新搜索引擎
  10. 【专栏必读】王道考研408数据结构万字笔记、题目题型总结、注意事项、目录导航和思维导图
  11. 追寻宇宙的形状--庞加莱猜想
  12. A Survey of Shape Feature Extraction Techniques中文翻译
  13. 不是有效的win32应用程序_什么是模块,VBA各种模块的有效行为
  14. Windows 11 / 10 怎样设置火狐浏览器的页面背景为护眼颜色
  15. matlab 相场法,晶体相场法模拟.pdf
  16. 这200道java大厂面试题全部掌握,“面试”想去哪就去哪
  17. 【LOJ】#2534. 「CQOI2018」异或序列
  18. Docker --restart参数
  19. 建筑智能信息网络系统计算机网络系统检检测指导书,04智能建筑检验批划分作业指导书.doc...
  20. AV1编码器速度和压缩率达到点播实用级别

热门文章

  1. Step4:从单应矩阵中分离得到内参和外参(需要拍摄n=3张标定图片)
  2. webassembly介绍
  3. 20159318 《网络攻防实践》第2周学习总结
  4. c语言实现模糊分类矩阵,模糊聚类分析C程序实现
  5. ​smooth-signature​.js: 前端canvas实现H5带笔锋手写签名,支持PC端和移动端使用,无框架限制,Vue、React等均可使用
  6. 三位数除以两位数竖式计算没有余数_四年级上册数学三位数除两位数练习题没有余数...
  7. Axure教程 原型设计工具Axure RP新手入门教程(一):基础
  8. 计算多项式的小技巧(Horner法则)
  9. jQuery手机版日历插件带农历
  10. 14、UI_02拨号盘动画