前10个mysql查询

时间:2014-04-13 18:00:26

标签: mysql sql performance

我需要一种更好的方法从我拥有的某些表中检索前10个不同的UID。

设置:

  • 表user_view_tracker
  • 包含{user id(uid),timestamp(ts)}
  • 每天都在成长(今天它的41k条目)

我的目标:

  • 在表user_view_tracker中生成最常查看用户ID的前10名

我当前的代码正在运行,但是慢慢地杀死了数据库:

select 
distinct uvt.uid as UID,
(select count(*) from user_view_tracker temp where temp.uid=uvt.uid and temp.ts>date_sub(now(),interval 1 month)) as CLICK 
from user_view_tracker uvt 
order by CLICK 
limit 10

很明显,不同的数据结构会有所帮助。但到目前为止,我无法做到这一点。

3 个答案:

答案 0 :(得分:1)

尝试:

select uid, count(*) as num_stamps
  from user_view_tracker
 where ts > date_sub(now(), interval 1 month)
 group by uid
 order by 2 desc limit 10

我保留了你的标准,直到过去一个月的计数。如果要全部计算,可以删除该行。

删除DISTINCT应该可以提高性能。如果您通过uid在外部查询和组中进行聚合,则没有必要,因为这会将数据聚合到每个uid的一行并带有计数。

答案 1 :(得分:1)

首先,删除该子查询,这应该足够了;)

select  
    uvt.uid as UID
    ,count(*) as CLICK 
from 
    user_view_tracker uvt 
where 
    uvt.ts > date_sub(now(),interval 1 month)
group by 
    uvt.uid
order by CLICK DESC
limit 10

答案 2 :(得分:0)

你应该在MySQL中使用Aggregate functions

SELECT UID, COUNT(ts) as Number_Of_Views FROM user_view_tracker
GROUP BY UID  
ORDER BY Number_Of_Views DESC
LIMIT 10

一个简单的演示,选择前10个UID观看
http://sqlfiddle.com/#!2/907c10/3