您的位置:首页 > 数据库 > MySQL

mysql 关于order by的优化

2018-02-02 16:24 399 查看
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!!!恐怖如斯。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: