Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在同一查询中使用group by和order by时,mysql查询速度会减慢_Mysql_Group By_Sql Order By - Fatal编程技术网

在同一查询中使用group by和order by时,mysql查询速度会减慢

在同一查询中使用group by和order by时,mysql查询速度会减慢,mysql,group-by,sql-order-by,Mysql,Group By,Sql Order By,我是mysql的初学者。我必须从表视图中获取查看次数最多的contentid(过去120小时)。视图表包含200000(10万)条记录。我已经为contentid列编制了索引,但我的查询最多需要10秒才能获取结果 视图表结构如下所示: contentid viewed ip 155 2011-10-26 00:07:52 216.251.77.226 1150 2011-10-26 00:08:15 65.52.109.72 1134

我是mysql的初学者。我必须从表视图中获取查看次数最多的contentid(过去120小时)。视图表包含200000(10万)条记录。我已经为contentid列编制了索引,但我的查询最多需要10秒才能获取结果

视图表结构如下所示:

contentid viewed                ip
155     2011-10-26 00:07:52     216.251.77.226
1150    2011-10-26 00:08:15     65.52.109.72
1134    2011-10-26 00:08:30     178.53.54.221
14      2011-10-26 00:08:49     178.53.54.221
693     2011-10-26 00:08:58     115.184.174.136
433     2011-10-26 00:09:14     66.249.71.138
558     2011-10-26 00:09:26     91.83.214.3
715     2011-10-26 00:16:01     128.171.36.161
226     2011-10-26 00:16:06     110.36.39.102
562     2011-10-26 00:16:51     84.3.173.188
1134    2011-10-26 00:16:53     110.39.67.139
198     2011-10-26 00:16:57     220.227.133.163
155     2011-10-27 05:43:59     64.135.215.142
155     2011-10-27 08:39:46     157.55.39.86
155     2011-10-27 11:23:05     99.55.166.146
155     2011-10-27 15:40:29     174.255.241.202
1150    2011-10-26 00:50:50     119.30.96.83
1150    2011-10-26 01:02:58     66.249.71.138
1150    2011-10-26 08:02:31     95.144.197.55
1132    2011-10-26 00:16:07     119.160.126.99
我的问题是

SELECT contentid FROM views 
where viewed > DATE_SUB(NOW(), INTERVAL 120 HOUR) 
GROUP BY contentid ORDER BY count(contentid ) desc limit 0, 15

我有一个理解,这可能是错误的,
Now()
函数将为每一行调用,为什么不调用此函数一次并保存结果并在查询中使用结果呢


尝试在
viewsed
列上添加索引,这样mysql就不必转到表中。执行此查询所需的所有数据都将在索引文件中提供。

我认为此查询的良好索引将是查看的
上的简单索引或查看的
上的复合索引(contentid,view)


您还应该将
计数(contentid)
更改为
计数(*)


尝试运行
EXPLAIN
$your_query
;您也可以在这里进行猜测,也许date_sub计算每个值需要很多时间,相反,您可以尝试添加一个新字段,其中包含自unix纪元以来的秒数,例如php中的time(),然后将where to new_字段>120*3600更改120小时。表中有哪些索引?解释显示了什么?@ypercube:EXPLAIN shows-type=range,可能的_key=viewsed,key=viewsed,key=len=4,ref=null,rows=73440,Extra=Using where;使用临时设备;使用文件端口因此查询使用
(已查看)
索引。尝试添加
(contentid,已查看)
索引。我认为这将导致更快的性能。(但不保证,这取决于您的表分布)感谢您的解决方案。我已经试过你说的了。但这没什么大不了的。@nithi请再看一个建议。谢谢你。对查看的列进行索引可以加快查询的执行。
SELECT contentid FROM views 
WHERE viewed > DATE_SUB(NOW(), INTERVAL 120 HOUR) 
GROUP BY contentid 
ORDER BY COUNT(*) DESC 
LIMIT 0, 15