像状态一样巨大的表格,从前100名中随机选择

时间:2013-01-10 20:46:03

标签: php mysql select random schema

我有一个表格可以保存帖子状态。 表格列是:

ID        //which is unique incremental
Post_id   //liked post
user_id   //user who gave like or dislike
type      //"1","0" or "2" which stands for Liked, neutral or disliked.

这里是示例数据

+--------+---------+---------+------+
| id     | post_id | user_id | type |
+--------+---------+---------+------+
| 938300 |  347298 |     661 |    0 |
| 938299 |  346185 |       0 |    1 |
| 938298 |  347286 |    2645 |    0 |
| 938297 |  346924 |     374 |    1 |
| 938296 |  347261 |    1523 |    1 |
| 938295 |  347313 |    3233 |    1 |
| 938294 |  346323 |    1375 |    1 |
| 938293 |  347022 |    1779 |    1 |
| 938292 |  347278 |    2645 |    1 |
| 938291 |  347300 |     109 |    1 |
+--------+---------+---------+------+
10 rows in set (0.01 sec)

然而,这个查询运行完美,但是你们可以看到这个表中有数百个数据。我需要的是:

SELECT post_id, 
       count(post_id) 
FROM   'table'
WHERE  type = '1' 
GROUP  BY post_id 
ORDER  BY count(post_id) 
LIMIT  300; 

此查询选择最喜欢的300个帖子,并且php代码从中随机选择一个。但是,此查询具有全表扫描,它将持续5秒钟。我怎样才能加快速度呢?或者我必须改变表方案吗?

1 个答案:

答案 0 :(得分:0)

您可以通过使用索引获得一些加速。您的查询是昂贵的计算方式,因此缓存可能是更好的答案。查看这些索引中的一个或两个是否有助于您的表:

CREATE INDEX post_id_index ON `table` (post_id);
CREATE INDEX type_index ON `table` (type);

如果没有,则删除它们:

DROP INDEX post_id_index ON `table`;
DROP INDEX type_index ON `table`;

如果他们没有帮助,请确保丢弃它们,但事先给他们几次尝试以确定。如果缓存不适合你的另一个选择是保留另一个表的结果。我想可能已经提出过了。我建议索引,因为创建它们非常容易。只需将每个命令作为完整的SQL命令运行,然后查看相关查询是否更快。以下是有关索引的更多信息:

http://dev.mysql.com/doc/refman/5.0/en/mysql-indexes.html