【发布时间】:2024-05-04 08:30:06
【问题描述】:
我正在 Google AppEngine 上运行一个多租户 Java 高复制 Web 应用程序。应用程序成功使用了多属性索引(在 datastore-indexes.xml 文件中配置)。好吧,至少到现在为止……
从今天开始,至少有一个命名空间在执行查询时会引发 DatastoreNeedIndexExceptions。奇怪的是,相同的查询在其他命名空间中也有效。
这是 datastore-indexes.xml 中的索引配置和管理面板中的索引状态:
<?xml version="1.0" encoding="utf-8"?>
<datastore-indexes autoGenerate="false">
<datastore-index kind="Index_Asc_Asc_Asc_Asc" ancestor="false" source="manual">
<property name="components" direction="asc"/>
<property name="component_0" direction="asc"/>
<property name="component_1" direction="asc"/>
<property name="component_2" direction="asc"/>
<property name="component_3" direction="asc"/>
</datastore-index>
</datastore-indexes>
对应的查询如下所示:
SELECT __key__ FROM Index_Asc_Asc_Asc_Asc WHERE components = '12340987hja' AND component_0 = 'asdfeawsefad' AND component_1 = '4FnlnSYiJuo25mNU' AND component_3 = 'cvxyvsdfsa' AND component_2 >= 0
当我在我的应用程序或管理面板数据存储视图中执行此查询时,App Engine 会抛出 DatastoreNeedIndexException 并提供以下建议。同样,相同的查询也适用于其他命名空间:
The suggested index for this query is:
<datastore-index kind="Index_Asc_Asc_Asc_Asc" ancestor="false">
<property name="component_0" direction="asc" />
<property name="component_1" direction="asc" />
<property name="component_3" direction="asc" />
<property name="components" direction="asc" />
<property name="component_2" direction="asc" />
</datastore-index>
调查:
- 我尝试设置 autoGenerate="true",但确实遇到了同样的错误,并且没有添加新的索引。
- 我已尝试在新创建的命名空间中执行查询:没问题。
- 开发服务器中没有出现该错误。
我有什么遗漏吗?有没有其他人遇到过同样的问题?为什么相同的查询在其他命名空间中有效,但在该命名空间中无效?
谢谢!
【问题讨论】:
-
错误中建议的索引与您所说的定义的不同。您是否手动添加了建议的索引定义?
-
您好,蒂姆,感谢您的评论!它在哪些方面有所不同?财产顺序重要吗?有一些文件吗?谢谢!
-
逐行查看索引规格。它们必须完全匹配。秩序很重要。只需剪切并粘贴索引规范并进行部署。全部在文档中。
-
蒂姆,你是对的。秩序很重要。我还没有在文档中找到相应的信息,但我只是添加了推荐的索引以进行测试。有用。不幸的是,在我的设置中,不可能盲目地添加该索引。不过,感谢您的帮助!
-
实际上文档确实提到了它。索引是查询和排序顺序的组合。如果您阅读了索引是如何工作的,那么很明显索引的每个成员和顺序都必须与您正在使用的查询相匹配。我很好奇为什么您不能添加与您希望执行的查询匹配的索引规范。正如您所发现的,如果不添加索引,查询将不起作用。