ruby—在mysql中使用distinct时查询速度慢,并且有各种其他条件(1000万条记录)

ycggw6v2  于 2021-06-20  发布在  Mysql
关注(0)|答案(1)|浏览(479)

我在一个社交网络上工作,像往常一样,那里有一个用户的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万条记录。
我可以做些什么改变来优化它?

jutyujz0

jutyujz01#

首先,对于rds上的生产数据库,我建议创建一个读取副本,并将所有那些繁重的select查询转移到副本上。这是文件的链接。这样做可以减轻用户的冻结问题,因为繁重的查询不会像通常的工作负载那样在同一个示例上执行。
其次,考虑为那些繁重的查询所涉及的表创建索引。要明智地选择要创建的索引,请使用explain语句并检查主要瓶颈,即查询在哪里采取更多步骤来获取正确的数据。
如果你真的不能摆脱那些in语句(我认为至少其中的一些应该是可以的,比如后面的users id和languages,也许你可以用使用userid的简单连接来替换in)为相关的列创建索引。
告诉我们进展如何。

相关问题