mysql 关于order by的优化

explain SELECT m.*,u.username nickname,u.vip,u.appid 
FROM wwj_mingxi m 
left join wwj_user u on u.id=m.uid  
WHERE u.appid = 0
ORDER BY m.id desc 
LIMIT 0,20

这里写图片描述
花费时间4s
可以看出主要原因是使用了临时表,文件排序。也就是说order by m.id没有走索引。
为什么呢?

这里就要说了mysql有个叫驱动表的东西,如果ORDER BY的列不是驱动表中的列就会产生临时表,而且临时表并没有索引。那么怎么查看驱动表呢?

EXPLAIN 结果中,第一行出现的表就是驱动表(Important!)

这里明显我们的u表是驱动表,但是order by m.id也就造成了临时表以及文件排序。那么怎么优化呢?经过一上午精心专研,访问各大问答网站,翻阅各种资料。终于找到一个语法:

FORCE index(PRIMARY)

什么意思呢?就是强制使用索引!!!!
看一下修改后的sql:

EXPLAIN SELECT m.*,u.username nickname,u.vip,u.appid 
FROM wwj_mingxi m FORCE index(PRIMARY) 
join wwj_user u on u.id=m.uid 
where u.appid=0 
order by m.id desc 
LIMIT 0,20

再来看一下:
这里写图片描述

卧槽!!!!之前9万多行到现在20行,性能优化最大化!!!!!瞬间爆炸有没有!!!!!

如果你还不能体验他们之间的差距的话,这有两个数据:优化前查询需要使用4s,优化后只需0.001s!!!恐怖如斯。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值