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!!!恐怖如斯。