資料儲存庫索引

應用程式引擎會針對實體的每個屬性預先定義簡單的索引。 App Engine 應用程式可在名為 index.yaml中。開發伺服器遇到無法使用現有索引執行的查詢時,即會自動在這個檔案中新增建議。您可在上載應用程式之前編輯設定檔,以手動調整索引。

附註:基於索引的查詢機制支援各種查詢,適用於大多數應用程式。不過,這種機制並不支援其他資料庫技術常見的某些查詢種類,Datastore 查詢引擎尤其不支援彙整與匯總查詢。如需瞭解 Datastore 查詢的限制,請參閱 Datastore 查詢頁面。

索引定義和結構

索引的定義列於指定實體種類的屬性清單中,每個屬性會有對應的排序順序 (遞增或遞減)。如需與祖系查詢一同使用,索引也可以選擇是否包含實體的祖系。

索引表格中,該索引定義中提及的屬性都各自有一欄。表格中的每一列代表 Datastore 中的一個實體,這些實體可能是以索引為基礎的查詢結果。只有在索引使用的每個屬性均已設定編入索引的值時,該實體才會加入索引中;如果索引定義參照實體未設有值的屬性,該實體將不會出現在索引中,且因此不會在任何基於該索引的查詢結果中傳回。

索引表的資料列會依照索引定義的指定順序,先按祖系排序,再按屬性值排序。查詢的「完美索引」可以讓查詢以最有效率的方式執行,此索引由下列屬性依序定義:

  1. 等式篩選器使用的屬性
  2. 不等式篩選器使用的屬性 (可以不超過一個)
  3. 排序順序使用的屬性

這可確保每個潛在查詢執行作業的所有結果,都會出現在表格的連續列中。Datastore 會依照下列步驟使用完美索引來執行查詢:

  1. 找出查詢種類、篩選屬性、篩選運算子以及排序順序所對應的索引。
  2. 從索引的開頭開始掃描,直至找出符合該查詢所有篩選條件的第一個實體。
  3. 連續掃描索引,依次傳回每個實體,直到:
    • 遇到不符合篩選條件的實體,或
    • 抵達索引尾端,或
    • 已收集到查詢所要求的結果數上限。

例如,請思考以下查詢:

SELECT * FROM Person WHERE LastName = "Smith"
                       AND Height < 72
                  ORDER BY Height DESC

此查詢的完美索引是 Person 種類實體的索引鍵表格,其中包含 LastNameHeight 屬性值的欄。索引的排序順序是先按 LastName 遞增排序,再依 Height遞減排序。

如要產生這些索引,請按照下列方式設定索引:

indexes:
- kind: Person
  properties:
  - name: LastName
    direction: asc
  - name: Height
    direction: desc

屬於相同表單但具有不同篩選器值的兩個查詢,將使用相同的索引。例如,以下查詢使用與前述查詢相同的索引:

SELECT * FROM Person WHERE LastName = "Jones"
                       AND Height < 63
                     ORDER BY Height DESC

以下兩個查詢雖然形式不同,但也使用相同索引:

SELECT * FROM Person WHERE LastName = "Friedkin"
                       AND FirstName = "Damian"
                     ORDER BY Height ASC

SELECT * FROM Person WHERE LastName = "Blair"
                  ORDER BY FirstName, Height ASC

索引設定

根據預設,Datastore 會針對每種實體種類的每個屬性,自動預先定義索引。這些預先定義的索引便足以執行許多簡易查詢,例如只使用等式的查詢以及簡易的不等式查詢。如為其他查詢,應用程式必須在名為 index.yaml索引設定檔中定義所需索引。如果應用程式嘗試執行的查詢無法以可用索引 (預先定義的索引,或是索引設定檔指定的索引) 執行,查詢便會失敗並顯示 DatastoreNeedIndexException