优化mysql查询

时间:2016-03-28 14:20:17

标签: mysql sql

我的数据库中有5个表:user,log1,log2,log3和log4。 每个日志都保存有关用户的数据(log1是登录日志等) - 每个日志都有UserID,CreateTime和LogID作为列。

我想创建一个足够快的查询,它会显示每个日志拥有此用户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

问题是此查询花费了太多时间。

有人可以帮我优化查询吗?

2 个答案:

答案 0 :(得分: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)。
  • 这不会为给定用户创建四个表中记录的中间笛卡尔积。
  • 这不会在外部查询中使用group by
  • 索引可用于相关子查询。

答案 1 :(得分:0)

我想,您希望获得日志记录的统计信息。

我们有日志数据库,每天插入大约1万条记录。我们创建统计数据库并在日志表上添加触发器以进行插入。因此,我们更新或插入每个日志插入的统计记录。