2016-03-28 174 views
0

我在我的DB中有5個表:用戶,log1,log2,log3和log4。 每個日誌都會保存有關用戶的數據(log1是登錄日誌等) - 每個日誌都有UserID和CreateTime以及LogID作爲其列。優化mysql查詢

我想創建一個足夠快的查詢,它會告訴我每個日誌有這個用戶ID的次數。類似於:

select u.UserID, Count(log1.CreateTime) as l1, ... Count(log4.CreateTime) as l4 
from users u left join log1 on log1.UserID = u.UserID left join ... 
group by u.UserID 

問題是此查詢花費的時間太多。

任何人都可以幫助我優化我的查詢嗎?

+1

檢查查詢的執行計劃以確定事情發生的速度緩慢。我的猜測是你需要某個索引。 –

+0

你的RDBMS是什麼? Sql Server,MySql例如 –

+0

@HasanBİNBOĞAmysql。 – LordKalmar

回答

2

對於此查詢:

select u.UserID, Count(log1.CreateTime) as l1, ... Count(log4.CreateTime) as l4 
from users u left join 
    log1 
    on log1.UserID = u.UserID left join ... 
group by u.UserID 

你想在「日誌」表的索引:log1(UserId)

不過,我不認爲這是你真正需要的。用同樣的指標,你應該使用相關子查詢:

select u.*, 
     (select count(*) from log1 where log1.UserID = u.UserID) as log1_cnt, 
     . . . 
from users u; 

(這裏假定創建日期/時間列從來都不是NULL。)

這是有幾個原因更好:

  • 它做了正確的計數。您的版本爲四列生成相同的計數(或0)。
  • 這不會爲給定用戶爲四個表中的記錄創建中間Cartesian產品。
  • 這不會在外部查詢中使用group by
  • 索引可用於相關子查詢。
0

我想,你想得到你的日誌記錄的統計數據。

我們有日誌數據庫,每天插入大約1毫安的記錄。我們創建統計數據庫並在日誌表上添加觸發器以進行插入。所以我們更新或插入每個日誌插入的統計記錄。