【问题标题】:MySQL Indexes - Join and Order By need different indexesMySQL 索引 - Join 和 Order By 需要不同的索引
【发布时间】:2020-12-23 19:14:49
【问题描述】:

我正在构建一个社交订阅源,就像 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

但是,我无法让索引同时适用于 JOIN 和 ORDER BY。使这个查询规模化的理想查询和索引设置是什么?

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

提前致谢!

【问题讨论】:

  • 我们有成千上万的用户和数百万的帖子 - 也许考虑比“所有用户从一开始就发布所有帖子,然后是用户 X “?或许也可以减轻数据库排序数据的负担
  • 为followers (followed_by_id, user_id) 建立一个简单的索引应该会有很大帮助。
  • @slaakso 没有帖子?
  • 无法让索引为 ... ORDER BY 工作 - 我不太明白它会有什么帮助,因为无论如何你都是 select *ing ,因此任何将查询优化为“从索引中回答而不命中表”的可能性都会丢失,并且需要驱动顺序的数据在结果集中。我建议您更仔细地考虑您真正需要检索的数据
  • 嗯? activities 哪里来的?

标签: mysql indexing database-design


【解决方案1】:
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 应该允许该索引提供帮助。

如果您有未显示的 WHERE 或 LIMIT,则可能会显着改变分析。

【讨论】:

    猜你喜欢
    • 2011-09-29
    • 2012-03-27
    • 1970-01-01
    • 2020-10-03
    • 2010-11-16
    • 1970-01-01
    • 1970-01-01
    • 2017-02-18
    相关资源
    最近更新 更多