2014-09-27 40 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捕捉表格修改並修改當前的統計信息,並將其存儲在特殊的「緩存」表中。 因此,我們將在該表中準備好統計報告。幾乎沒有時間獲得統計報告!