数据存储查询不工作,要求比预期更多的索引
Datastore query is not working, asking more index than expected
<datastore-index kind="Environment" ancestor="false">
<property name="active" direction="asc" />
<property name="consumed" direction="asc" />
</datastore-index>
<datastore-index kind="Environment" ancestor="false">
<property name="active" direction="asc" />
<property name="creationDate" direction="desc" />
</datastore-index>
我有以上两个指标
当我如下查询时,它不工作,它说需要新的索引。
SELECT * FROM Environment
where active = false and consumed = true and creationDate < '2013-09-22'
GQL响应如下:
未找到匹配的索引。
此查询的建议索引是:
<datastore-index kind="Environment" ancestor="false">
<property name="active" direction="asc" />
<property name="consumed" direction="asc" />
<property name="creationDate" direction="asc" />
</datastore-index>
我做错了什么?它不应该基于之字形合并吗?
在查看之字形查询需要哪些索引时,将索引拆分为前缀和后缀非常有用。索引的前缀用于回答等式,而后缀用于回答不等式和排序。
为了执行合并连接,查询中涉及的所有索引的后缀必须匹配,以便排序顺序相同。因此,对于您的查询:
SELECT * FROM Environment where active = false and consumed = true and creationDate < '2013-09-22'
creationDate
必须在后缀中; active
和 consumed
必须在前缀中。
指数:
<datastore-index kind="Environment" ancestor="false">
<property name="active" direction="asc" />
<property name="consumed" direction="asc" />
<property name="creationDate" direction="asc" />
</datastore-index>
如果我们将索引拆分为consumed
和creationDate
之间的前缀和后缀就可以满足这个要求。但是,您也可以使用两个单独的索引来满足此要求:
<datastore-index kind="Environment" ancestor="false">
<property name="active" direction="asc" />
<property name="creationDate" direction="asc" />
</datastore-index>
<datastore-index kind="Environment" ancestor="false">
<property name="consumed" direction="asc" />
<property name="creationDate" direction="asc" />
</datastore-index>
在这种情况下,后缀将包含 creationDate
,前缀将分别为 active
和 consumed
。请注意在这种情况下,两个索引中的后缀如何匹配,这是执行之字形合并连接的要求。
对于您当前拥有的索引,无法回答查询,因为
<datastore-index kind="Environment" ancestor="false">
<property name="active" direction="asc" />
<property name="consumed" direction="asc" />
</datastore-index>
没有 creationDate
作为后缀。
<datastore-index kind="Environment" ancestor="false">
<property name="active" direction="asc" />
<property name="consumed" direction="asc" />
</datastore-index>
<datastore-index kind="Environment" ancestor="false">
<property name="active" direction="asc" />
<property name="creationDate" direction="desc" />
</datastore-index>
我有以上两个指标
当我如下查询时,它不工作,它说需要新的索引。
SELECT * FROM Environment
where active = false and consumed = true and creationDate < '2013-09-22'
GQL响应如下:
未找到匹配的索引。 此查询的建议索引是:
<datastore-index kind="Environment" ancestor="false">
<property name="active" direction="asc" />
<property name="consumed" direction="asc" />
<property name="creationDate" direction="asc" />
</datastore-index>
我做错了什么?它不应该基于之字形合并吗?
在查看之字形查询需要哪些索引时,将索引拆分为前缀和后缀非常有用。索引的前缀用于回答等式,而后缀用于回答不等式和排序。
为了执行合并连接,查询中涉及的所有索引的后缀必须匹配,以便排序顺序相同。因此,对于您的查询:
SELECT * FROM Environment where active = false and consumed = true and creationDate < '2013-09-22'
creationDate
必须在后缀中; active
和 consumed
必须在前缀中。
指数:
<datastore-index kind="Environment" ancestor="false">
<property name="active" direction="asc" />
<property name="consumed" direction="asc" />
<property name="creationDate" direction="asc" />
</datastore-index>
如果我们将索引拆分为consumed
和creationDate
之间的前缀和后缀就可以满足这个要求。但是,您也可以使用两个单独的索引来满足此要求:
<datastore-index kind="Environment" ancestor="false">
<property name="active" direction="asc" />
<property name="creationDate" direction="asc" />
</datastore-index>
<datastore-index kind="Environment" ancestor="false">
<property name="consumed" direction="asc" />
<property name="creationDate" direction="asc" />
</datastore-index>
在这种情况下,后缀将包含 creationDate
,前缀将分别为 active
和 consumed
。请注意在这种情况下,两个索引中的后缀如何匹配,这是执行之字形合并连接的要求。
对于您当前拥有的索引,无法回答查询,因为
<datastore-index kind="Environment" ancestor="false">
<property name="active" direction="asc" />
<property name="consumed" direction="asc" />
</datastore-index>
没有 creationDate
作为后缀。