同样sql,同样的执行计划在不同环境效率相差10倍

Posted 渔夫数据库笔记

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了同样sql,同样的执行计划在不同环境效率相差10倍相关的知识,希望对你有一定的参考价值。

1.数据库版本

8.0.13

2.问题描述

研发兄弟跑来咨询一个问题。他们一个sql在压测环境跑,居然比生产环境高效10倍。(压测环境8C32G,生产环境16C128G)。

申明下,这个sql确实存在优化空间,但是优化sql和本文的问题是两个问题,这里不讨论如何优化这条sql

拿到他的sql我做了测试,确实如他所说,在压测环境执行时间基本稳定在2-4s左右,但是在生产环境基本需要稳定在50s左右(为了排除数据不在buffer_pool中,每个环境我都进行对sql进行了连续多次执行。但是最后还是因为缓存的问题,坑)

压测和生产环境相关信息如下:

 #从上面两个图中,我们可以看出两个环境的表记录数量基本一致,压测环境记录稍微多些,两个环境sql执行计划也都是全表扫描,但是压测环境执行时间就比生产环境高效很多。最开始我想是不是生产环境表碎片太大,导致全表扫描需要读取更多的页,检查发现两个环境中该表都没有什么碎片。

3.问题分析

    说实话问题分析到这边的时候,被卡了好长时间,思维定式导致我认为我在两个环境中都是连续多次执行该sql,可以排除 buffer_pool的影响。但是最后的结果确不是。问题的最终原因就是生产环境中每次执行该sql都是从磁盘中读取(这个可以从Innodb_data_read监控看到迹象),而压测环境执行过一次后该表数据基本都能被缓存不被换出。

关于Innodb_data_read详情请见:

Innodb Read IO 相关参数源代码解析

最后给一张生产环境执行该sql时,关于innodb_data_read 的监控图:

#从图中可以看出该sql执行时innodb_data_read 变量值上升明显,sql执行完成后又恢复正常

以上是关于同样sql,同样的执行计划在不同环境效率相差10倍的主要内容,如果未能解决你的问题,请参考以下文章

Explain 执行计划 和 SQL优化

MySQLMySQL 5.7持久化统计信息详解

大数据问题排查系列- 同样的HIVE SQL,在CDH与TDH平台执行效率差异的根本原因

sql 同样一条查询脚本,在2个服务器里执行耗费的时间差很多,为啥?

PostgreSQL查询当前执行中sql的执行计划——pg_show_plans模块

Intel 计划在Linux kernel中引入 User Interrupts,效率是eventfd的10倍