今天,我有了一个数据库,其中包含3个测试案例中的统计数据查询。我使用php来构建一个网站,但是查询执行起来太长了,所以我不能像我不想做的那样显示完整的站点统计数据。由于现在数据库很少成批更新,因此我可以使事件每天/每周更新数据库。
我今天有以下3个查询来显示我想要的信息:
SELECT key FROM testcase GROUP BY key;
这给了我一个包含4-10组测试的int的列表。比如说,1,2,3,4的论点。然后,我在子查询中将其作为关键字进行迭代,以获得通过测试的次数和未通过的测试数,并使用以下2个查询:
SELECT COUNT(*) AS passed FROM testcase INNER JOIN testcases ON
testcase.ID = testcases.testcaseid WHERE pass = 1 AND key = %value%;
和
SELECT COUNT(*) AS failed FROM testcase INNER JOIN testcases ON
testcase.ID = testcases.testcaseid WHERE pass = 0 AND key = %value%;
这就是今天的工作方式。每个键的查询时间大约为25-30秒,这使得站点超时。(%值%是for循环中当前值的伪代码)
相反,我想到了一个sql查询,它将其添加到一个数据库表中,该表由键、传递表和失败表组成,我每天/每周填充这些表,以便在站点上显示为统计数据。我已经看到了一些情况,您可以迭代一个子查询,但是由于两个执行的查询截然相反,所以我看不出有任何解决方案。
我尝试过索引我在查询中使用的值,但没有成功(这也可能是错误的)。
// Andreas (SQL新手)
编辑:
哦,进退两难,在哪里设置解决方案,我做了一个组合戈登和乔,使最快的查询,工作起来像一个魅力:
INSERT INTO statistics (key,passed,failed)
SELECT
key,
SUM(case when T.pass = 1 then T.matches else 0 end) as passed,
SUM(case when T.pass = 0 then T.matches else 0 end) as failed
FROM
(SELECT
key,pass,COUNT(*) AS matches
FROM testcase INNER JOIN testcases ON
testcase.ID = testcases.testcaseid
GROUP BY key,pass)T
GROUP BY key
发布于 2013-03-04 19:21:54
我认为您应该使用一个查询来完成所有这些操作,该查询返回所需的键和信息:
select key,
SUM(case when pass = 1 AND key = %value% then 1 else 0 end) as passed,
SUM(case when pass = 0 AND key = %value% then 1 else 0 end) as failed
from testcase INNER JOIN testcases ON
testcase.ID = testcases.testcaseid
group by key
在可能的范围内,您应该让数据库执行“迭代”,并只读取结果数据。
回应你的评论。如果您在$VALUE中有一个键列表,那么您可以:
insert into statistics(key, pass, fail)
select key,
SUM(case when pass = 1 then 1 else 0 end) as passed,
SUM(case when pass = 0 then 1 else 0 end) as failed
from testcase INNER JOIN testcases ON
testcase.ID = testcases.testcaseid
where concat(',', $VALUE, ',') like concat('%', key, '%')
group by key
或者,如果要生成查询,则可以将列表放入in
子句中。因此,where
看起来可能是:
where key in (2, 3, 4, 5)
发布于 2013-03-04 19:18:24
尝试:
select key, pass, count(*) from testcase group by key, pass
pass
上的索引将是无用的。在key
上索引,这应该会有一点帮助。但如果基数是4-10,就不会有太大帮助了。
https://stackoverflow.com/questions/15209249
复制相似问题