使用mysql中的两个表,有没有更快的方法来执行逐行计数



我正在尝试查找给定日期范围内订单表中存在的门店总数(按国家id(。

select  o2.nation_id,count(o2.id) as outlet_count
from  outlets o2
where  o2.id in (
SELECT  distinct o.outlet_id
from  orders o
where  order_date >= '2022-05-01 00:00:00'
and  order_date <= '2022-06-30 23:59:59'
)
group by  o2.nation_id ``` 

现在,这个查询给出了确切的结果,但大约需要3秒钟。有什么方法可以更快地执行此查询吗?可能不到1秒。注意:Outlets表包含大约25000个数据,订单表包含大约120万行。

避免IN将提高性能并为nation_id&outlet表中的id列和orders表中的outlet_id列肯定会提高速度。

select  o2.nation_id,  count(Ord.outlet_id) as outlet_count
from  outlets o2
LEFT JOIN 
(
SELECT  distinct o.outlet_id
from  orders o
where  order_date >= '2022-05-01 00:00:00'
and  order_date <= '2022-06-30 23:59:59'
) Ord ON o2.id = Ord.outlet_id
group by  o2.nation_id

尝试一下。这是我刚刚发明并测试(在不同的表格上(的一件棘手的事情:

SELECT  ou.nation_id, COUNT(*) AS outlet_count
FROM ( SELECT o.outlet_id, MIN(order_date)
FROM orders AS o
WHERE o.order_date >= '2022-05-01'
AND o.order_date  < '2022-05-01' + INTERVAL 2 MONTH
GROUP BY o.outlet_id
) AS olist
JOIN outlets AS ou  ON ou.id = olist.outlet_id
GROUP BY ou.nation_id

GROUP BYMIN(或MAX等(一起是使优化器跳过索引的一个技巧,每个outlet_id只接触一行。省略MIN或改为DISTINCT都没有涉及到优化。(注意:不同版本的MySQL/MariaDB在这里的工作方式可能不同。(

orders:  INDEX(outlet_id, order_date)  -- required for the trick

如果有任何问题,请提供SHOW CREATE TABLEEXPLAIN SELECT ...

相关内容

最新更新