【发布时间】:2011-02-07 20:22:26
【问题描述】:
我有一个订单表,其中包含超过 2 亿条记录。对于统计数据,我需要获得三个不同的计数。首先是某个日期范围内的订单数量,然后是特定状态下的订单数量,最后是特定日期范围内特定状态的订单数量。前两个查询平均返回 10-2000 万条记录,通常需要不到 5 秒的时间。但是,我无法在一个小时内获得第三个查询以返回结果。以下是实际查询:
SELECT COUNT(*)
FROM orders
WHERE order_date BETWEEN date1 AND date2;
上面有1000万条记录要汇总,查询需要4秒。
SELECT COUNT(*)
FROM orders
LEFT JOIN customers ON orders.customer_id = customers.customer_id
WHERE customer.state = 'PA';
上面有1500万条记录要汇总,查询需要5秒。
(SELECT COUNT(*)
FROM orders
WHERE order_date BETWEEN date1 AND date2)
UNION
(SELECT COUNT(*)
FROM orders
LEFT JOIN customers ON orders.customer_id=customers.customer_id
WHERE customer.state = 'PA');
上面有4500条记录要汇总,查询需要2个小时。
对于第三个查询,我可以采取另一种方法来在更合理的时间内为我提供计数吗?最好不到一分钟?
【问题讨论】:
-
您能否发布表格定义以及 EXPLAIN 输出?
-
您意识到 UNION 将删除重复项 - 如果两者都是 25,您将只看到一行。
-
忘记时间,第三次查询没有返回正确的结果。
-
“返回 10-2000 万条记录”是指搜索 1000 万条记录。没有
GROUP BY的COUNT(*)只会返回 1 条记录。 -
我的意思是返回的计数在 10000000 和 20000000 之间。我的理论是第三个操作必须比较这么多数据是它花费这么长时间的原因。