我创建了一个查询,从两个表收集数据,summs起来,并表示案件的数量和总SUMM:创造一个更好的查询,总结两个表
SELECT
count(ut.id) AS total
, (SUM(internal_account) - SUM((SELECT
SUM(ub.bill_summs)
FROM
u_billing ub
WHERE
ub.bill_types = 'correction'
AND ub.contract_id = ut.contract_id
))) AS summ
FROM
u_transactions ut
WHERE
ut.nulled = 0
AND ut.type = 'comission'
AND ut._status = 'not_paid'
AND DATE(ut.add_timestamp) = DATE('2012-05-11');
,但它实在是太慢了。在测试情况下,它给了这样的结果:
+-------+-------+
| total | summ |
+-------+-------+
| 182 | 15105 |
+-------+-------+
1 row in set (4.13 sec)
这是182例,为仅为1天4.13秒,但我活的服务器有超过60万的情况下,所以这将是非常缓慢。
任何想法,我如何重写查询以获得更好的性能?
解决方案与重塑查询(IES):
DELETE FROM tmpContractSums;
INSERT INTO tmpContractSums
SELECT
ub.contract_id
, SUM(ub.bill_summs) AS bill_summs
FROM
u_billing ub
WHERE
ub.bill_types = 'correction'
GROUP BY ub.contract_id;
SELECT
count(ut.id) AS total
, (SUM(internal_account) - SUM(bill_summs))
FROM
u_transactions ut
LEFT JOIN tmpContractSums t ON ut.contract_id = t.contract_id
WHERE
ut.nulled = 0
AND ut.type = 'comission'
AND ut._status = 'not_paid'
AND ut.add_timestamp BETWEEN '2012-05-11 00:00:00' AND '2012-05-11 23:59:59';
执行时间:500ms的
PS:既然不能放弃与WEBUSER表我刚刚创建的表:
CREATE TABLE tmpContractSums AS SELECT contract_id, bill_summs FROM u_billing WHERE 1 = 0;
我正在删除记录。速度不如下降,但仍然快于原始速度。
你在其上运行一个查询分析器?你可以给我们一个关于'u_transactions'和'u_billing'的描述,例如计费是否有一个add_timestamp字段或任何其他加入账单和交易的字段? ...你有没有索引? – Nix
您不可能加入u_billing ub和u_transactions ut表吗? – DevelopmentIsMyPassion
@Nix允许合并它们的唯一参数是'contract_id'。是的,我尝试了索引,但没有任何改进。 – Peon