mysql查询sys.innodb_buffer_stats_by_table慢原因分析

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mysql查询sys.innodb_buffer_stats_by_table慢原因分析相关的知识,希望对你有一定的参考价值。

参考技术A 该查询语句会遍历整个innodb_buffer_pool页面,并将采集到的信息填充到information_schema.innndb_buffer_page表,innodb_buffer_pool越大耗时越长。

在遍历innodb_buffer_pool中每一个page上时,将采集到的信息存储在一个内部heap临时表中。当内存表达到上限后,mysql会通过create_ondisk_from_heap( )函数创建磁盘临时表(该磁盘临时表会放在ibtmp1临时共享表空间中),并将内存表中已有数据拷贝到磁盘临时表中,后续对该表的写入也是写入磁盘临时表中。如果用的是innodb磁盘临时表,写入时会产生大量脏页,脏页刷盘时产生磁盘io,innodb_buffer_pool越大产生脏页面越多,对磁盘io影响越大。

mysql select查询中出现意外的查询结果

【中文标题】mysql select查询中出现意外的查询结果【英文标题】:Unexpected query result in mysql select query 【发布时间】:2020-08-01 17:23:24 【问题描述】:

我正在尝试运行 MySQL 查询以从名为 production 的表中获取最后一个生产数量(这是用户先前添加的数量,在这种情况下为 7),但我得到的是最高产量。这些是表格:

_____ Production ___________
"production_id","prod_id","production_date","production_qty"
"1","40001","2020-04-15","35"
"2","40002","2019-02-08","54"
"3","40002","2020-04-08","67"
"4","40001","2020-04-02","76"
"5","40001","2020-05-08","21"
"6","40001","2020-04-29","34"
"7","40003","2020-04-03","545"
"8","40003","2020-04-18","7"
"9","40001","2020-04-25","6"
"10","40001","2020-04-25","6"
"11","40001","2020-04-25","6"
"12","40002","2020-04-13","5"
"13","40003","2020-04-01","5"
"14","40001","2020-04-17","3"
"15","40003","2020-04-04","2"
"16","40002","2020-04-11","45"
"17","40001","2020-04-02","4"
"18","40002","2020-04-01","3"
"19","40003","2020-04-17","2"
"20","40003","2020-04-29","3"

______ Products ____________
"product_id","product_name","product_unit","product_group","product_size"
"40001","tested","Gram","EVA","7/10"
"40002","testing","KG","EVA","7/10"
"40003","teste454","KG","PU","7/10"

这是我的查询:

SELECT product_id, product_unit, production_qty, SUM(production_qty) as prod_in_hand FROM 
products JOIN production ON products.product_id = production.prod_id WHERE product_id = 
40003 AND production_date < CURRENT_DATE

上面的查询产生了这个结果:

prod_id, product_unit, production_qty, prod_in_hand
40003, KG, 545, 561

但我期待“7”作为生产数量。 我怎样才能做到这一点? 我正在使用 XAMPP 服务器 phpMyAdmin MariaDB 服务器版本 10.3.16

【问题讨论】:

你在使用MySQL 8.0吗?并发布您的预期输出。 您正在对生产日期 请在代码问题中给出minimal reproducible example--剪切&粘贴&可运行代码;具有期望和实际输出(包括逐字错误消息)的示例输入(作为初始化代码);标签和版本;明确的规范和解释。对于包含最少代码的错误,您可以给出的代码是您显示的代码可以通过您显示的代码扩展为不正常。 (调试基础。)对于 SQL 包括 DDL 和表格初始化。当你得到一个你不期望的结果时,找出你的误解是什么。--隔离第一个错误的子表达式及其输入和输出。 (调试基础。) 您的查询是一个常见问题。在考虑发布之前,请阅读手册和谷歌任何错误消息或您的问题/问题/目标的许多清晰、简洁和精确的措辞,有和没有您的特定字符串/名称和站点:***.com 和标签;阅读许多答案。如果您发布问题,请使用一个短语作为标题。反映你的研究。请参阅How to Ask 和投票箭头鼠标悬停文本。 @philipxy last 表示此特定产品的最后一个条目,如果我到那时分组,我会收到多个条目,但只需要一个 【参考方案1】:

我将其理解为每组最大 n 个问题,您希望从 production 检索 products 中每条记录的“最后一个”记录。这是使用相关子查询进行过滤的方法:

select
    ps.*,
    pn.production_date,
    pn.production_qty
from products ps
inner join production pn 
    on pn.prod_id = ps.product_id
where pn.production_date = (
    select max(pn1.production_date)
    from production pn1
    where pn1.prod_id = ps.product_id
)

如果您运行的是 MySQL 8.0(或 MariaDB 10.2),您也可以为此使用 row_number()

select *
from (
    select
        ps.*,
        pn.production_date,
        pn.production_qty,
        row_number() over(partition by ps.product_id order by pn.production_date desc) rn
    from products ps
    inner join production pn 
        on pn.prod_id = ps.product_id
) t
where rn = 1

【讨论】:

以上是关于mysql查询sys.innodb_buffer_stats_by_table慢原因分析的主要内容,如果未能解决你的问题,请参考以下文章

高级查询语句____ Mysql

Mysql的学习4____数据的查询

01_MySQL DQL_基础查询

MySql过滤查询到产品变体表[重复]

07_MySQL DQL_多表查询_等值内连接

MySQL:优化查询