2013-06-30 66 views
3

我有關於曲折合併連接算法的問題。在文章https://developers.google.com/appengine/articles/indexselection,提到Appengine ZigZag合併加入Algo

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

Z字形合併連接在應用程序引擎的算法有助於通過組合單獨掃描較小的索引由同一個屬性排序,給出的結果是共同的,這些指標得出的結果,以減少所需的索引。因此,在谷歌文檔中給出的例子中,上owner_id索引具有上date(desc)排序順序和上size索引具有date(desc)相同的排序順序。因此,對於這兩個屬性以及相同的排序順序日期(desc)進行查詢,可以避免附加的組合索引,因爲之字形合併將使用2個單獨的索引來查找結果。

在您的例子中,2個指標不能因爲它們沒有排序上相同的屬性,從而爲您的查詢,您將需要一個相應的指數組合。

如果2個指標就像上面,既通過hideIt(asc)分類:我會使用你的數據,其中曲折合併連接可以用來給一個虛構的例子,那麼如果你對voteCount,createdByDate,hideIt有一個查詢,那麼你不需要爲這個組合添加一個額外的索引,而現有的兩個索引將會滿足你的目的。