[转] MySQL用left join替换select in结构改善效率

October 8, 2011 by SLJ | Category:MySQL | 1 Comment Font size: AA   AA

今天为客户代维服务器,发现打开WEB速度奇慢,一开始以为是台湾地震,又影响到了海底光缆

客户问我是否要重启下服务器,我说 “不用,你的服务器负载不重,应该不是这个原因”

说完,随手top 了下,晕,还真是负载严重的厉害

LOAD AVG 竟然也达到了 15 16 18左右

于是登陆mysql,找原因

发现大量 copy to temp table 的信息,而语句就是

select `id_category` from `ps_category_product`
where `id_product`
in(select `id_product` from `ps_image` where `date_add`>1 
group by `id_product`)
group by `id_category`

 

下面这个图片是我本机测试的

这条语句用时 0.1383 秒,一条近0.14秒啊…而我在客户服务器上看到的是 30几秒还有40多秒的….

这里用了 select in 这个结构..平时用的很多,还真没发现原来效率这么低….客户的服务器上有30多个站,每个站都在不停的使用这条语句进行查询,可想而知负载为什么这么高了

于是,改进,将 select in 结构,替换为 left join 结构

select p.`id_category` from `ps_category_product` p 
left join `ps_image` i 
on p.`id_product`=i.`id_product`
where i.`date_add`>1
group by p.`id_categor
替换到服务器,发现负载下降了

mysql 下降到 78.9%,比刚才小了很多,系统的load avg也下降到 2和3左右

下面这个图片是我本机测试这条语句的

用时 0.0398,仅仅是刚才的 28%,可见,效果非常明显

这里提醒大家,慎用 select in 结构的查询,另外,因为用了两次 group by 也对性能有一定影响

Other Posts / 其他文章



1 Comment

我要评论
  • adam.lu October 24, 2011

    可是使用join不分表分库:-(

Leave a Comment:

*
*
*
*

↑ Top