我在一个社交网络上工作,像往常一样,那里有一个用户的feed,在那里他们能够看到用户正在跟踪的用户的活动,而不是被用户阻止的用户。
这是当前从activities表中使用的查询
SELECT DISTINCT `activities`.`post_id`
FROM `activities`
WHERE (activities.user_id IN ([followed_user_ids]) AND
activities.language_id IN ([language_ids]) AND
activities.id <= ?) AND
(`activities`.`post_user_id` NOT IN ([blocked_and_deactivated_user_ids]))
ORDER BY `activities`.`id` DESC
LIMIT 1 OFFSET 10
这是导致问题的查询。有时mysql的cpu使用率达到100%,这会给用户带来问题。我还对活动表中使用的列使用了索引。
活动表中有1000万条记录。
我可以做些什么改变来优化它?
1条答案
按热度按时间jutyujz01#
首先,对于rds上的生产数据库,我建议创建一个读取副本,并将所有那些繁重的select查询转移到副本上。这是文件的链接。这样做可以减轻用户的冻结问题,因为繁重的查询不会像通常的工作负载那样在同一个示例上执行。
其次,考虑为那些繁重的查询所涉及的表创建索引。要明智地选择要创建的索引,请使用explain语句并检查主要瓶颈,即查询在哪里采取更多步骤来获取正确的数据。
如果你真的不能摆脱那些in语句(我认为至少其中的一些应该是可以的,比如后面的users id和languages,也许你可以用使用userid的简单连接来替换in)为相关的列创建索引。
告诉我们进展如何。