首页 > 解决方案 > MySQL 索引 - Join 和 Order By 需要不同的索引

问题描述

我正在构建一个社交订阅源,就像 Twitter 一样。

我有一张posts,users和的表格followers

我的目标是优化提要查询,该查询将获取您关注的用户的所有帖子并按新近度排序。

查询如下所示:

SELECT * from posts inner join followers on followers.user_id = posts.user_id
where followers.followed_by_id = {authenticatedUser.id}
order by posts.created_at DESC

但是,我无法让索引同时适用于JOINORDER BY. 使此查询扩展的理想查询和索引设置是什么?

我们有数十万users和数百万个posts.

提前致谢!<3 我感谢你们所有人。

标签: mysqlindexingdatabase-design

解决方案


followers:  INDEX(followed_by_id, user_id)  -- composite; order is important

不要说SELECT *,而是拼出实际需要的列。这可能导致定义“覆盖”索引。

INDEX(user_id, created_at)不会帮助的。这是因为涉及多个 user_id。

更改为ORDER BY user_id, created_at应该允许该索引提供帮助。

如果你有一个WHERELIMIT你没有显示,那可能会极大地改变分析。


推荐阅读