4

我对之字形合并连接算法有疑问。在文章https://developers.google.com/appengine/articles/indexselection中提到

Index(Photo, owner_id, -date), 
Index(Photo, size, -date)

可以结合成为

Index(Photo, owner_id, size, -date) ;

我的测试如下:

  <datastore-index kind="KindTest1" ancestor="false" source="auto">
        <property name="hideIt" direction="asc"/>
        <property name="voteCount" direction="desc"/>
    </datastore-index>

    <datastore-index kind="KindTest1" ancestor="false" source="auto">
        <property name="hideIt" direction="asc"/>
        <property name="createdByDate" direction="asc"/>
    </datastore-index>

can these 2 indexes combine to become,

    <datastore-index kind="KindTest1" ancestor="false" source="auto">
        <property name="hideIt" direction="asc"/>
        <property name="createdByDate" direction="asc"/>
        <property name="voteCount" direction="desc"/>
    </datastore-index>

我给你发电子邮件的原因是因为当我在开发和生产中尝试这个时,它不起作用并且需要每个单独的索引。可以详细说明吗?

4

1 回答 1

5

应用程序引擎中的 zig-zag 合并连接算法有助于减少所需的索引,方法是组合通过扫描按相同属性排序的单独较小索引得出的结果,以提供这些索引共有的结果。因此,在 google 文档中给出的示例中,索引 onowner_id具有排序顺序,date(desc)并且索引 onsize具有相同的排序顺序 date(desc)。因此,对于这两个属性以及相同的排序顺序日期(desc)进行查询,可以避免额外的组合索引,因为 zigzag 合并将使用 2 个单独的索引找到结果。

在您的示例中,这 2 个索引不能合并,因为它们没有按相同的属性排序,因此对于您的查询,您将需要一个相应的索引。我将使用您的数据给出一个虚构的示例,其中可以使用 zigzag 合并连接:

如果您的 2 个索引与上面类似,并且都按 排序hideIt(asc),那么如果您有查询,voteCount,createdByDate,hideIt 那么您不需要针对此组合的附加索引,并且 2 个现有索引将满足您的目的。

于 2013-06-30T04:15:35.967 回答