appengine: 需要索引错误:内置索引对于此查询和数据效率不足,请为此查询添加复合索引

2 投票
2 回答
1078 浏览
提问于 2025-04-15 14:00

在使用django.core.paginator中的ObjectPaginator时,我遇到了这个错误:

需要索引错误:内置的索引对于这个查询和你的数据来说效率不够高。请为这个查询添加一个复合索引。

原始查询是这样的:

query = models.Cdr.all()
query.filter("var1 =", var1 )
query.filter("var2 =", var2)
query.filter("var3 =", var3)

当ObjectPaginator尝试计算元素数量时,我会遇到这个异常,但只有在某些var1的值下才会出现。

为什么这个查询在某些var1的值下会失败,而在其他值下又能正常工作呢?

你对此有什么建议吗?

2 个回答

1

我遇到了一个问题。这个问题不是出在你的代码上,而是出在GAE的索引系统本身。要解决这个问题,你需要在你的index.yaml文件中明确写出索引。这对我有效,但我在其他地方看到,明确定义索引可能并不总是能解决问题。无论如何,我建议你给我提的这个bug点个赞

GAE不会自动为只有相等过滤器的查询建立索引。相反,它使用一种谷歌称之为“锯齿合并连接”的算法(你可以去谷歌一下)。看起来在某些情况下,这个算法会出现问题。谷歌团队似乎正在努力修复这个问题,但在某些情况下仍然会出现。

2

解决NeedIndexError错误的一般步骤是这个。我猜在你的开发环境中,可能没有建立复合索引,这取决于数据的数量和结构(这些会根据var1的值而变化)。但是在实际使用时,系统需要这个索引(为了提高查询效率,避免中断查询,正如错误信息所提示的,Nick在评论中也确认了这一点)。

撰写回答