You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何给Django模型添加索引反而导致执行时间变长?

为什么给Django模型的slug字段加索引后,全量查询反而变慢?

核心原因:索引的适用场景不匹配

你执行的City.objects.all()是全量获取表中所有数据,这种场景下数据库使用索引反而会增加开销:

  • 数据库索引是额外的树状数据结构,存储了字段值和对应数据行的指针。当执行全量查询时,用索引需要先遍历索引树,再逐个通过指针去主表读取数据,这比直接扫描主表(全表扫描)多了一层操作。
  • 当表中数据量较小时,索引带来的额外IO开销会超过它的优势,导致整体执行时间上升。

索引的正确使用场景

给slug字段加索引是有意义的,但只针对需要定位特定数据的查询,比如:

  • 通过slug过滤单条数据:City.objects.get(slug="shanghai")
  • 按slug排序:City.objects.all().order_by("slug")
  • 基于slug的精确匹配查询

在这些场景下,索引能让数据库快速定位到目标数据,避免全表扫描,大幅提升查询速度。

是否建议给slug字段加索引?

取决于你的业务需求:

  • 如果你的系统经常通过slug来查询、定位城市数据(比如详情页路由依赖slug),强烈建议加索引,这会让这类高频查询的性能提升非常明显,远大于全量查询的微小损耗。
  • 如果几乎不会用slug做过滤、排序,只是偶尔查全量数据,那确实没必要加——索引不仅会增加全量查询的开销,还会提升数据写入/更新时的成本(每次新增或修改City记录,数据库都要维护索引结构)。

额外提示

  1. 测试性能时不要只看单次结果,建议多次执行取平均值,避免系统波动带来的偶然误差。
  2. 当表中数据量增长到上万条以上时,全量查询的性能差异会缩小,而过滤查询的索引优势会更加凸显。
  3. 注意你的模型代码里name字段的max_lenght是拼写错误,应该是max_length,虽然这和当前性能问题无关,但可能导致运行错误。

内容的提问来源于stack exchange,提问作者SLDem

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 12:27:18