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好的,看来情况会是这样,因为你要求计数,所以需要进行全面扫描。我只是想我会把它扔出去以防万一。缓存可能确实是最健壮的解决方案。