我想提供一个功能,我可以告诉的朋友最常浏览的网页。 我的朋友们表有570万行和意见表有530万行。 目前,我只是想运行这两个表的查询,并通过一个人的朋友找到了20点最观看页面的ID。
这里是因为我有现在查询:
SELECT page_id
FROM `views` INNER JOIN `friendships` ON friendships.receiver_id = views.user_id
WHERE (`friendships`.`creator_id` = 143416)
GROUP BY page_id
ORDER BY count(views.user_id) desc
LIMIT 20
这里是如何的解释长相:
+----+-------------+-------------+------+-----------------------------------------+---------------------------------+---------+-----------------------------------------+------+----------------------------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------------+------+-----------------------------------------+---------------------------------+---------+-----------------------------------------+------+----------------------------------------------+
| 1 | SIMPLE | friendships | ref | PRIMARY,index_friendships_on_creator_id | index_friendships_on_creator_id | 4 | const | 271 | Using index; Using temporary; Using filesort |
| 1 | SIMPLE | views | ref | PRIMARY | PRIMARY | 4 | friendships.receiver_id | 11 | Using index |
+----+-------------+-------------+------+-----------------------------------------+---------------------------------+---------+-----------------------------------------+------+----------------------------------------------+
意见表有(USER_ID,PAGE_ID)的一个主键,你可以看到这个被使用。 的友谊表具有(receiver_id,creator_id)的主键,和一个次级指数(creator_id)。
如果我通过和限进行查询,而不群,有这个特定的用户大约25000行 - 这是典型的。
在最近的实际运行中,这个查询了7秒过于执行,这对于一个Web应用程序体面的响应的时间太长了。
有一两件事我不知道是我是否应该调整二级指标是(creator_id,receiver_id)。 我不知道这会给多大的性能提升的虽然。 我今天可能会尝试根据这个问题的答案。
你能看到任何方式查询可以被改写,使之减轻快?
更新:我需要做的就可以了更多的测试,但它似乎我讨厌查询工作出更好,如果我不这样做的分组,并在数据库排序,但这样做在以后的红宝石。 总的时间要短得多 - 约80%,它似乎。 也许我的早期测试是有缺陷的 - 但这绝对值得更多的研究。 如果这是真的 - 那么跆拳道是Mysql的做什么?