Php 巨大的职位状态表,从前100名中随机选择

Php 巨大的职位状态表,从前100名中随机选择,php,mysql,select,random,schema,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        //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秒内进行。如何提高速度,还是必须更改表方案?

您可以通过使用索引来提高速度。您的查询在计算方面非常昂贵,因此缓存可能是更好的答案。查看这些索引中的一个或两个是否有助于您的表:

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命令运行,并查看相关查询是否更快。以下是有关索引的更多信息:


听起来是一个很好的缓存候选。好吧,这种计算是昂贵的,但在理论上,结果不会经常改变,特别是如果这些是最受欢迎的所有时间。因此,运行查询,然后将结果保存在某个地方,然后在应用程序中访问结果,这应该是即时的。好主意。从来没有想过,我可能会让cron每周更新一次结果。好的,谢谢这个解决方案。由于您的特殊需要,在posts表上实际设置一个类似的计数器可能是有意义的;这样,你就可以在一个简单的查询中得到你想要的信息。谢谢,我现在看到索引可以带来巨大的不同,真的很大。然而,我的表已经有了它们,但我认为我的查询永远不能使用它们,因为我猜它必须进行全表扫描。正如@Mansfield所说,缓存是解决这一问题的最佳解决方案case@AkainuLionheart好的,看来情况会是这样,因为你要求计数,所以需要进行全面扫描。我只是想我会把它扔出去以防万一。缓存可能确实是最健壮的解决方案。