在JOIN中重写慢速SQL(子)查询

时间:2015-05-29 07:31:52

标签: mysql sql join subquery

所以我得到了大量缓慢的SQL查询,并且我将其缩小到一个慢的子查询,所以我想将它重写为JOIN。但是我被卡住了......(由于MAXGROUP BY

SELECT *
FROM local.advice AS aa
  LEFT JOIN webdb.account AS oa ON oa.shortname = aa.shortname 
WHERE aa.aa_id = ANY (SELECT MAX(dup.aa_id)
                      FROM local.advice AS dup
                      GROUP BY dup.shortname) 
  AND oa.cat LIKE '111'
ORDER BY aa.ram, aa.cpu DESC
LIMIT 0, 30

1 个答案:

答案 0 :(得分:2)

以下是查询的不同版本,其中子查询使用join子句转换

select * from local.advice aa 
JOIN webdb.account oa ON oa.shortname = aa.shortname 
join(
 select max(aa_id) as aa_id,shortname from local.advice 
 group by shortname
)x on x.aa_id = aa.aa_id
where
oa.cat = '111'
order by aa.ram, aa.cpu DESC 
limit 0,30

如果尚未添加索引,您可能还需要应用索引

alter table local.advice add index shortname_idx(shortname);
alter table webdb.account add index cat_shortname_idx(cat,shortname);
alter table local.advice add index ram_idx(ram);
alter table local.advice add index cpu_idx(cpu);

我假设aa_id是主键,所以没有添加索引

确保在应用索引之前备份表