Django中按用户筛选并按修改时间倒序查询的最优索引选择
Django查询索引优化解答
你的查询语句为:
Posts.objects.filter(user=user).order_by('-last_modified')
原则上更优的索引选择:选项1 Index(fields=['user_id', '-last_modified'])
原因如下:
- 这个复合索引完全贴合你的查询逻辑:
- 第一步通过
user_id快速过滤出指定用户的所有帖子,直接缩小目标数据集范围 - 索引内部已经按
-last_modified(最近修改的内容排在最前)完成排序,数据库无需额外执行排序操作,直接返回结果
- 第一步通过
对比选项2和Django自动创建的外键索引:
- 选项2的单字段索引
Index(fields=['-last_modified'])仅能优化排序环节,但过滤user_id时需要依赖Django自动生成的外键单字段索引。即便数据库支持索引合并,这种操作的效率远低于复合索引:- 索引合并需要分别扫描两个独立索引,再对结果做交集处理,额外开销高
- 合并后的结果仍需重新排序,无法省略排序步骤
- Django自动为外键创建的
user_id单字段索引,只能满足过滤需求,无法覆盖排序操作,无法实现"索引内完成整个查询"的最优效果
简单来说,选项1的复合索引是对该查询的完美适配,能最大化减少数据库的IO和计算开销。
内容的提问来源于stack exchange,提问作者ssabc
相关产品推荐
相关产品推荐

