[英]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.