mysql如何查看SQL语句的逻辑读与物理读_利用SET_STATISTICS监控

梦伟酱_1517

梦伟酱_1517

2026-04-25

455人浏览

原创

MySQL不支持SET STATISTICS IO,因其为SQL Server特有语法;应使用performance_schema.global_status差值法测单条SQL的逻辑读与物理读,并关注其比值评估缓冲池效率。

mysql如何查看sql语句的逻辑读与物理读_利用set_statistics监控

SET STATISTICS IO 在 MySQL 中根本不可用——这是 SQL Server 的语法,直接执行会报错 ERROR 1064 (42000)。MySQL 没有类似 T-SQL 的运行时 I/O 统计开关,必须换思路。

为什么不能用 SET STATISTICS IO?

MySQL 和 SQL Server 的监控机制完全不同:SET STATISTICS IO ON 是 SQL Server 特有的会话级开关,用于输出每条语句的逻辑读、物理读、预读页数等;MySQL 没有该命令,也不在客户端返回中嵌入这类运行时 I/O 统计。试图复制 SQL Server 做法只会得到语法错误。

用 performance_schema.global_status 差值法测单条 SQL

这是最常用、兼容性最好的方式,适用于 MySQL 5.6+,原理是捕获执行前后两个全局状态变量的变化量:

MySQL
MySQL

编写正确的MySQL查询,避免字符集、索引和锁方面的常见陷阱。

下载
  • Innodb_buffer_pool_read_requests 表示逻辑读总次数(缓存命中 + 缓存未命中都算一次访问)
  • Innodb_buffer_pool_reads 表示物理读总次数(真正从磁盘读取页的次数)
  • 执行前先用 SELECT variable_value INTO @init_reqs FROM performance_schema.global_status WHERE variable_name = 'Innodb_buffer_pool_read_requests'; 记录初始值
  • 再执行目标 SQL(注意:必须在同一个连接中,否则会受其他会话干扰)
  • 执行后查最终值并做减法:SELECT (@final_reqs - @init_reqs) AS logical_reads, (@final_reads - @init_reads) AS physical_reads;

容易被忽略的干扰点

这个方法看似简单,但实际踩坑率很高:

  • 其他并发查询会同时修改 Innodb_buffer_pool_read_requests 和 Innodb_buffer_pool_reads,导致差值不准——必须确保测试期间无其他写/读密集操作,或在专用测试库中进行
  • 如果目标 SQL 触发了隐式事务(如 UPDATE 前自动开启事务),且未显式 COMMIT,后续语句可能复用相同事务上下文,影响缓冲池行为
  • Innodb_buffer_pool_reads 只统计“首次加载页”的物理读,同一页被反复访问只算 1 次物理读、多次逻辑读;但如果你在循环里反复执行同一条 SELECT,第二次起基本全是逻辑读,此时差值法依然有效,只是要理解这个语义
  • 不建议用 Innodb_rows_read 代替逻辑读——它统计的是行级扫描次数,不是页级访问次数,和“逻辑读”在 InnoDB 层的定义不一致

想看更细粒度?打开 Performance Schema 的 statement_digest

MySQL 5.7+ 支持开启 performance_schema 的语句摘要表,可长期追踪某类 SQL 的平均物理读/逻辑读趋势:

  • 确认已启用:SELECT * FROM performance_schema.setup_consumers WHERE NAME = 'events_statements_digests';,若为 NO 需先 UPDATE performance_schema.setup_consumers SET ENABLED = 'YES' WHERE NAME = 'events_statements_digests';
  • 查询最近执行过的语句摘要:SELECT DIGEST_TEXT, COUNT_STAR, SUM_TIMER_WAIT, SUM_ROWS_AFFECTED, SUM_CREATED_TMP_TABLES, SUM_SELECT_FULL_JOIN, SUM_INNODB_PAGE_READS FROM performance_schema.events_statements_summary_by_digest WHERE DIGEST_TEXT LIKE '%your_table%';
  • 注意:SUM_INNODB_PAGE_READS 是 MySQL 8.0.23+ 新增字段,旧版本没有;逻辑读仍需靠 buffer_pool_read_requests 差值推算

真实环境里,单次 SQL 的物理读/逻辑读数值本身意义有限,关键要看它们的比值——如果 physical_reads / logical_reads 接近 1,说明缓冲池严重不足或查询无法利用索引;如果接近 0,说明数据基本都在内存里。别只盯着绝对数字。

相关专题

更多
C语言变量命名
C语言变量命名

c语言变量名规则是:1、变量名以英文字母开头;2、变量名中的字母是区分大小写的;3、变量名不能是关键字;4、变量名中不能包含空格、标点符号和类型说明符。php中文网还提供c语言变量的相关下载、相关课程等内容,供大家免费下载使用。

2023.06.20

3429

3

c语言入门自学零基础
c语言入门自学零基础

C语言是当代人学习及生活中的必备基础知识,应用十分广泛,本专题为大家c语言入门自学零基础的相关文章,以及相关课程,感兴趣的朋友千万不要错过了。

2023.07.25

2388

9

c语言运算符的优先级顺序
c语言运算符的优先级顺序

c语言运算符的优先级顺序是括号运算符 > 一元运算符 > 算术运算符 > 移位运算符 > 关系运算符 > 位运算符 > 逻辑运算符 > 赋值运算符 > 逗号运算符。本专题为大家提供c语言运算符相关的各种文章、以及下载和课程。

2023.08.02

1320

5

c语言数据结构
c语言数据结构

数据结构是指将数据按照一定的方式组织和存储的方法。它是计算机科学中的重要概念,用来描述和解决实际问题中的数据组织和处理问题。数据结构可以分为线性结构和非线性结构。线性结构包括数组、链表、堆栈和队列等,而非线性结构包括树和图等。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.09

1278

4

c语言random函数用法
c语言random函数用法

c语言random函数用法:1、random.random,随机生成(0,1)之间的浮点数;2、random.randint,随机生成在范围之内的整数,两个参数分别表示上限和下限;3、random.randrange,在指定范围内,按指定基数递增的集合中获得一个随机数;4、random.choice,从序列中随机抽选一个数;5、random.shuffle,随机排序。

2023.09.05

1396

5

c语言const用法
c语言const用法

const是关键字,可以用于声明常量、函数参数中的const修饰符、const修饰函数返回值、const修饰指针。详细介绍:1、声明常量,const关键字可用于声明常量,常量的值在程序运行期间不可修改,常量可以是基本数据类型,如整数、浮点数、字符等,也可是自定义的数据类型;2、函数参数中的const修饰符,const关键字可用于函数的参数中,表示该参数在函数内部不可修改等等。

2023.09.20

2278

7

c语言get函数的用法
c语言get函数的用法

get函数是一个用于从输入流中获取字符的函数。可以从键盘、文件或其他输入设备中读取字符,并将其存储在指定的变量中。本文介绍了get函数的用法以及一些相关的注意事项。希望这篇文章能够帮助你更好地理解和使用get函数 。

2023.09.20

3700

8

c数组初始化的方法
c数组初始化的方法

c语言数组初始化的方法有直接赋值法、不完全初始化法、省略数组长度法和二维数组初始化法。详细介绍:1、直接赋值法,这种方法可以直接将数组的值进行初始化;2、不完全初始化法,。这种方法可以在一定程度上节省内存空间;3、省略数组长度法,这种方法可以让编译器自动计算数组的长度;4、二维数组初始化法等等。

2023.09.22

17215

6

c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

2023.09.22

549

3

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL vs MySQL
PostgreSQL vs MySQL

共1课时 | 191人学习