MySql语句关联优化问题,为什么加了限制条件反而更慢?

发布于 2022-09-06 20:29:03 字数 997 浏览 23 评论 0

Sql语句如下

 select u.name,
       u.user_id,
       u.phone,
       a.title,
       a.address,
       r.device_id,
       r.type,
       b.money,
       b.pay_type,
       r.create_time,
       r.reward_money
  from(
select device_id, out_trade_no, reward_money, type, c_address_id, create_time
  from charge_reward_bill
 where  type=3  and user_id='100034' and create_time>='2018-02-13' and create_time<'2018-03-14') as r
  inner join charge_bill b on b.out_trade_no= r.out_trade_no and b.pay_time<'2018-03-14' and b.pay_time>='2018-02-13' #如果把pay_time的限制条件加上反而更慢了
  inner join device_address_change a on a.id= r.c_address_id
  left join user_app_info u on u.user_id= a.user_id
 order by r.create_time desc
 limit 10000,10

charge_reward_bill数据量700W左右,charge_bill数据量200W左右,均已分库分表,device_address_change 和user_app_info 是2张小表。

目前来说,查询速度比较慢,第一个表不用子查询也会更慢
问题:charge_bill 这个表关联为什么加上时间的限制条件反而会更慢呢? pay_time上没有索引,字段类型为datetime
,求大佬们说说,或者给点优化思路

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

塔塔猫 2022-09-13 20:29:03

inner join本来走一个关联字段的索引就够了
你非要让人家回表再筛选一遍当然慢了
要优化就结合业务,
1、子查询里面索引选择是不是最优了,比如user_id是不是会比create_time更快?
2、1表2表使用了out_trade_no关联,看字段名应该是交易单号一类的,这种是否还需要在2表进行时间筛选?
3、最后一个排序加limit是最耗时的,内存排序再过滤掉几万数据明显不合理,尝试其他方式筛选,比如时间划分粒度更小一点,翻页功能实现网上方案很多,多看下,借鉴一下别人的实现方式

椵侞 2022-09-13 20:29:03

试试把b.pay_time<'2018-03-14' and b.pay_time>='2018-02-13'这两个条件写到where条件里

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文