繁体   English   中英

如何优化以下SQL查询

[英]How can I optimize the following SQL query

现在需要很长时间才能运行。

查询是:

select count(id), variety_id, name 
from tblItem 
where order_id IN (
    select order_id 
    from tblItem 
    where variety_id=4005 
    order by order_id DESC) 
AND variety_id != 4005 
GROUP BY variety_id 
order by count(id) DESC
LIMIT 5;

我有关于variable_id和order_id的索引。 我基本上是在尝试建立推荐引擎。 该查询正在寻找人们在还购买了variant_id 4005时购买的前5个项目。但是就像我说的那样,这需要很长时间才能运行。

有没有人可以优化此查询?

尝试这个:

select count(t1.id), t1.variety_id, t1.name 
from tblItem t1
inner join tblItem t2 ON t2.order_id = t1.order_id and t2.variety_id = 4005
where t1.variety_id != 4005 
GROUP BY t1.variety_id, t1.name
ORDER BY count(t1.id) DESC 
LIMIT 5;

我经常发现MySQL优化WHERE ... IN (SELECT ...)很差,而JOIN效果更好。 我已经读到最近的MySQL版本更好,所以它可能取决于版本。 此外,除非列可以为NULL并且您需要忽略计数中的空值,否则应使用COUNT(*)

SELECT COUNT(*) count, variety_id, name
FROM tblItem AS t1
JOIN (SELECT DISTINCT order_id
      FROM tblItem
      WHERE variety_id = 4005) AS t2
ON t1.order_id = t2.order_id
WHERE t1.variety_id != 4005
GROUP BY variety_id
ORDER BY count DESC
LIMIT 5

需要使用DISTINCT的子查询来防止将计数乘以叉积中匹配的行数。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM