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.还有方法优化吗


 

第 1 个答案:

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

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

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

 

第 2 个答案:

left join换成join
appid加个索引


 

第 3 个答案:

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


 

第 4 个答案:

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


 

第 5 个答案:

你那是明细表和用户表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 的字段最好也是要索引的。

在使用nuxt的过程中,引入一个第三方插件‘alert’挂载到vue.use(Alert)。当前运行npm run dev 后报出Unexpected token import。初步怀疑是nuxt将这个a ...