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
,求大佬们说说,或者给点优化思路
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(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
条件里