关于mysql优化问题

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 id desc LIMIT 0,20

clipboard.png
索引也建了,但是查询还是要4s.还有方法优化吗

阅读 2.6k
5 个回答

using temporary,using filesort ---表示用了临时表和文件排序,当然会慢了。

为什么会产生临时表和文件排序? 我猜是因为 你用m作为主表,又用了u.id作为排序,解决方法是:

  1. 如果你用u.id来排序,那最好用u来作主表去join m表
  2. 如果不能改用u作主表,那可以试试将主表改为子查询,将排序放到子查询中

left join换成join
appid加个索引

从你的explain中能看出。一共检索 91585 行。4秒肯定索引建立不正确。 起到作用的索引 u.appid,m.user_id_ix。你应该 u.id ,m.uid 建立相应的索引或外键。

出现了using temporary,这里mysql需要创建一个临时表来存储结果,这通常发生在对不同的列集进行order by。

你那是明细表和用户表join吧。

  1. where条件里有u.appid=0,那说明肯定是可以用right join代替你的left join,right join会更快一些;
  2. u.id,m.uid,u.appid要是都有索引就更快了,你最后的order by id其实就是order by u.id吧,order by 的字段最好也是要索引的。
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题