MySQL远程查询性能异常(40s vs 1.8s)求助排查
经过一番折腾,终于找到问题根源了——这居然是MySQL连接器的bug!先谢谢之前帮我出主意优化表结构的朋友们,不过问题比表结构的问题要深得多,我把整个问题和排查过程理出来给大家参考:
初始问题
我有一条非常简单的查询语句:
SELECT a, b, c FROM d WHERE cola <= 123456789012345 and 123456789012345 <= colb
这条语句在Windows版MySQL 8.0.21服务器本地执行只需要1.8s,但通过远程连接执行居然要40s,而且结果只返回1行数据。服务器上的表有1000万行数据,网络是高速光纤,带宽肯定不是问题:
- 用Workbench在服务器本地执行:1.89s
- 本地电脑用Navicat远程执行:30-60s不等(耗时随服务器负载波动)
排查过程(更新记录)
UPDATE 1:环境对比与执行计划分析
- 慢日志完全验证了本地和远程的耗时差异确实和实际情况一致
- 换到Linux服务器的MariaDB上测试,本地、远程执行都只需要2s,推测问题出在Windows版MySQL 8.0.21上,可能和升级流程有关
- 执行计划详情如下:
- Select type: Simple
- Type: ALL
- Possible keys: cola, colb, cola-colb, colb-cola
- key: null
- key_len: null
- rows: 10M
- filtered: 22.58
- Extra: using WHERE
UPDATE 2:表结构信息(本地与远程环境完全一致)
表的创建语句如下:
CREATE TABLE `d` ( `cola` decimal(39,0) unsigned DEFAULT NULL, `colb` decimal(39,0) unsigned DEFAULT NULL, `a` char(2) COLLATE utf8_bin DEFAULT NULL, `b` varchar(64) COLLATE utf8_bin DEFAULT NULL, `c` varchar(128) COLLATE utf8_bin DEFAULT NULL, `d` varchar(128) COLLATE utf8_bin DEFAULT NULL, KEY `idx_cola` (`cola`), KEY `idx_colb` (`colb`), KEY `idx_cola_colb` (`cola`,`colb`), KEY `idx_colb_cola` (`colb`,`cola`) USING BTREE ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin
UPDATE 3:切换存储引擎后的表现
把表转为InnoDB后,出现了这些变化:
- 本地和远程执行耗时变得接近,但都需要6-7s,反而比MyISAM时的2s慢了
- 按照@Rick James的建议优化索引后,服务器本地执行耗时降到1s以内,但远程执行还是需要7s,本地和远程的性能差异依然存在
UPDATE 4:不同客户端/连接方式的差异测试
在服务器上测试了不同连接方式的表现,结果更奇怪:
- 自定义程序用localhost连接执行:7s
- 相同查询在Workbench本地执行:0.9s
- 远程用Workbench执行:0.9s
- 远程用Navicat/mysql.data连接器(MySQL 8.0.21版本)执行:7s
这种差异实在让人费解
UPDATE 5:本地复现与bug提交
我在本地电脑也成功复现了这个问题:
- Workbench执行查询:0.9s
- 自定义程序和Navicat执行相同查询:7s
目前已经向官方提交了这个bug
UPDATE 6:性能架构数据补充
补充性能架构的数据:只有通过Workbench执行的完全相同的查询,性能表现正常,其他客户端或连接器都会出现耗时飙升的情况
内容的提问来源于stack exchange,提问作者Dani
相关产品推荐
相关产品推荐

