[转] MySQL用left join替换select in结构改善效率
今天为客户代维服务器,发现打开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 也对性能有一定影响
1 Comment
我要评论可是使用join不分表分库:-(