2014-09-27 67 views
0

那么,我有一个很好的索引和一些数据的MySQL表,我需要为这些数据做一个统计报告。这意味着我有很多事情在这样的查询快速计算MySQL表中的统计信息

select 
    count(*) n, 
    sum(if(column1>0,1,0)) n1, 
    sum(if(<simple expression>,1,0)) n2, 
    sum(if(<another simple expression>,1,0)) n3, 
    .... 
from table1 
left join table 2 ... 

group by <simple expression> 

的问题是,这个查询是很慢的。将整个表从InnoDB转换为MyISAM可以将查询时间从30秒缩短到8秒,这很好,但是MyISAM有其他的限制,阻止多个用户同时使用这个表(TABLE LOCK实际上锁定整个应用程序)。 我知道需要将整个表加载到内存中的原因。鉴于表格有几千兆字节大小,这几乎是不可能的,这就是为什么我们有这样的放缓。 我正在寻找这个问题的良好解决方案。有谁能够帮助我?

+0

在MySQL布尔有整数表示,所以你可以直接总结它们。 – 2014-09-27 18:29:28

+0

你可以在单独的查询中尝试每个选择值吗?它可能只有其中一个未被正确优化,或正在放慢其他或某事。 Mysql对于每个值可能都需要不同的索引,并因此而失去速度。先看看他们每个人先看看哪一个很快,哪一个很慢。 – vrijdenker 2014-09-27 18:31:42

+0

@ PM77-1表示:您可以使用SUM(column1> 0)来代替SUM(IF(column1> 0,1,0)) – 2014-09-27 18:38:20

回答

0

我找到了解决方案。统计信息可以在一天(或每小时)内完全计算一次,我们可以使用TRIGGER捕捉表格修改并修改当前的统计信息,并将其存储在特殊的“缓存”表中。 因此,我们将在该表中准备好统计报告。几乎没有时间获得统计报告!