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

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
,求大佬们说说,或者给点优化思路

阅读 6k
2 个回答

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

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

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题