mysql - 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
但是,我无法让索引同时适用于JOIN
和ORDER BY
. 使此查询扩展的理想查询和索引设置是什么?
我们有数十万users
和数百万个posts
.
提前致谢!<3 我感谢你们所有人。
解决方案
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
你没有显示,那可能会极大地改变分析。
推荐阅读
- r - R神经网络包隐藏神经元,单vs向量参数
- r - 使用 group_by() 和 dplyr 为每个聚合桶创建列
- git - 尝试使用 ssh 推送到 Bitbucket 时出错
- elasticsearch - 从 Elasticsearch 5.2.2 升级到 7.3
- kubernetes - 我需要了解以下 kube_state_metrics 描述。确切地看是特定指标在做什么
- docker - 最佳实践 - 在 repo 中有多个 docker-compose 文件
- javascript - 尝试使用 *ngFor 循环显示数组
- python - 如何以全位深度保存多个子图
- javascript - 如何在位置更改后更新对象旋转枢轴
- c# - C# LINQ 按如下所示格式按对象列表分组