Mysql 建立索引之后反而变慢(已解决)

Mysql 建立索引之后反而变慢(已解决)

记录一个神奇的问题,解决方法分享给大家,碰到类似问题,可以试试这种方法。

SQL查询背景

  • 需要优化建索引的表为 FEDERATED 引擎(远程表)
  • 数据库1(服务器1)关联 数据库2(服务器2) 的表进行查询,故使用远程表

PS:索引失效请注意关联字段字符集是否相同

问题描述

未修改前,Sql查询速度稳定 4 s 左右

执行计划如下:

可以看到三个表(t2,t3,remote_xxx)未走索引,这三个表中的数据量也不多1000 - 3W 左右。
在这里插入图片描述
优化之后执行计划如下:

可以看到所有的查询都已经走了索引,但是查询速度 14.323 s,而且优化这三个表,每增加一个索引,整体查询速度就会慢几秒
在这里插入图片描述

解决方法

原 SQL 语句 t2,t3 相关的语句如下

 LEFT JOIN remote_xxx1 t2
 ON t2.fd_id = obj.fd_id and t2.qrcode_uuid = obj.fd_code_uuid
 LEFT JOIN remote_xxx2 t3
 ON t3.fd_id = obj.fd_id and t3.qrcode_uuid = obj.fd_code_uuid

修改之后

 LEFT JOIN (select * from remote_xxx1 ) as t2
 ON t2.fd_id = obj.fd_id and t2.qrcode_uuid = obj.fd_code_uuid
 LEFT JOIN (select * from remote_xxx2 ) as t3
 ON t3.fd_id = obj.fd_id and t3.qrcode_uuid = obj.fd_code_uuid

FEDERATED 远程表在连接查询时,如果发现出现类似情况,可以用

(select * from remote_xxx ) 将 远程表 remote_xxx 包一层,再将索引相关的条件也移动到里面。

以本问题为例,将 fd_id 字段查询条件也放在里面

(select * from remote_xxx1 where fd_id = '2c90e41872dff0860172dff0868c0000')

修改完成之后,查询0.575 s
在这里插入图片描述

  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值