Py学习  »  DATABASE

MySQL平滑迁移GaussDB?一次压测暴露的SQL性能“陷阱”及深度优化实录

中亦科技 • 6 天前 • 20 次点击  
图片

在国产化替代的浪潮中,将业务从MySQL等传统数据库迁移到GaussDB等信创数据库,是许多企业正在经历或即将面临的重要课题。

今天,我们想和大家分享一个近期在为某大型能源企业进行POC(概念验证)测试时遇到的真实案例。一条在原环境中运行良好的SQL,迁移到GaussDB后,在压力测试下性能却未达预期。

这个过程颇具代表性,希望能为同样走在信创路上的朋友们提供一些参考。



图片

问题浮现

故事的开端,是一次常规的压测。

客户的业务系统从MySQL迁移至GaussDB后,我们使用JMeter进行压力测试。很快发现,系统的整体吞吐量(TPS)不如预期,通过监控定位到了一条高频执行的SQL,成为了性能瓶颈。

原始SQL

select t.*,IF('HN01'=t.org code,1,0AS is_handle,IF('HN01'


    
=t.org code,1,0AS sort,IF( o.org_code = 'HN01','',IF('HN01'='HN01',(SELECT prop_name FROM base_dim WHERE isdelete=0 AND  prop_code = o.province_code),o.org name ) ) AS org_name,w.tel_phone AS wechatPhoneFROM t_mdata_customer tLEFT JOIN base_org o ON o.org_code=t.org_code AND o.isdelete='0'LEFT JOIN web_user w ON w.id=t.wechat_idwhere t.isdelete='0'ORDER BY is_handle DESC,sort DESC,t.create_time DESC,t.customer_name desc LIMIT 20;

这条SQL的业务逻辑并不复杂,主要是一个分页查询,包含了几个LEFT JOINIF函数判断。然而,它在GaussDB(单节点8C64G)上的表现,却与TDSQL环境(16C32G)存在明显差距。



图片

性能分析

SQL语句:

1TDSQL的执行计划:

2GuassDB的执行计划:

通过两个执行计划对比发现:TDSQL扫描t表数据后直接排序。排序后再进行join

通过SQL改写实现相同的计划,GaussDB执行如下:

现在耗时主要在1.0S但是直接执行seq scan。

Seqscansort为什么慢还需要确认,初步判断是if判断导到的单表查询,增加 if判断,seqscan就慢了很多,耗时达到了1.1s。

if判断修改为明确值,seqscan值为620ms。

初步结论:优化器生成的计划不优。



图片

表结构

base_dim

base_org

web_user

t_mdata_customer



图片

问题解决方法

按照MySQL数据库执行计划思路,去掉排序过程,创建索引:

create index on t_mdata_customer(IF('HN01'=t.org code,1,0) desc,create_time desc,customer_name desc);

创建索引后不能走索引,加了hit也不行,创建索引去掉customer_name字段就可以了,经排查发现,此问题为已知bug,后面版本已解决此bug,规避方法如下:

使用rdsadmin用户登录先查询备份后删除记录:

在查看执行计划就走索引了,执行计划如下:

跳过sort,直接limit20条记录后出了结果,执行时间1毫秒。

再次进行压力测试,系统吞吐量恢复正常,性能瓶颈被彻底消除。

这个案例本身技术难度不算顶尖,但它的排查过程,恰恰是数据库国产化迁移中最具价值的实践缩影。我们想借此分享三点思考:

1迁移复制:从一种数据库迁移到另一种,绝不是简单的数据搬家。不同数据库的优化器脾气秉性各不相同,必须对核心SQL进行充分的性能回归测试,不能想当然地认为原有的最优 依然适用。

2经验是灯塔:当遇到看似不合逻辑的灵异现象时,往往是深入到了产品本身的特性或边界。此时,深厚的产品知识和丰富的踩坑经验,就成了照亮前路的灯塔。

3与生态同行:任何数据库产品都在不断迭代进化。了解其版本特性、已知问题和演进路线,是保障系统长期稳定、高效运行的关键。这也是我们作为华为GaussDB核心服务伙伴,持续投入技术研究的价值所在。

我们始终相信,踏踏实实解决好每一个看似微小的技术问题,正是保障客户核心业务稳健前行的基石。

如果您在数据库迁移、性能优化或运维方面遇到任何挑战,欢迎随时与我们交流。


往期推荐

GaussDB慢sql信息收集和执行计划查看



GaussDB 集群故障应急修复:从线下实例异常到全面恢复的实战指南



Oracle迁移GaussDB:一个“简单问题”背后的普遍性“运维陷阱”



图片
图片


Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/186193
 
20 次点击