我有一个表格可以保存帖子状态。 表格列是:
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秒钟。我怎样才能加快速度呢?或者我必须改变表方案吗?
答案 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命令运行,然后查看相关查询是否更快。以下是有关索引的更多信息: