

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 在 DynamoDB 中使用次要索引來改善資料存取
<a name="SecondaryIndexes"></a>

Amazon DynamoDB 透過指定主索引鍵值來提供資料表中項目的快速存取。不過，許多應用程式都會受益於下列情況：有一或多個次要 (或替代) 索引鍵可用，允許使用主索引鍵以外的屬性來有效存取資料。若要解決此問題，您可以在資料表上建立一或多個次要索引，並針對這些索引發出 `Query` 或 `Scan` 請求。

*次要索引*是一種資料結構，包含資料表中的屬性子集，以及可支援 `Query` 操作的替代索引鍵。您可以使用 `Query` 從索引擷取資料，方式與您搭配使用 `Query` 與資料表相同。一份資料表可以有多個次要索引，讓您的應用程式能夠存取許多不同的查詢模式。

**注意**  
您也可以對索引進行 `Scan`，方式與您對資料表進行 `Scan` 相同。  
[資源型政策](access-control-resource-based.md)目前不支援次要索引掃描操作的跨帳戶存取。

每個次要索引都只能與一個資料表建立關聯，次要索引可從資料表中取得其資料。這稱為索引的*基礎資料表*。當您建立索引時，請定義索引的替代索引鍵 (分割區索引鍵和排序索引鍵)。您還可以定義要從基礎資料表*投影*或複製到索引中的屬性。DynamoDB 會將這些屬性以及基礎資料表中的主索引鍵屬性複製到索引。您接著可以查詢或掃描索引，就像查詢或掃描資料表一樣。

DynamoDB 會自動維護每個次要索引。當您新增、修改或刪除基礎資料表中的項目時，也會更新該資料表上的任何索引，以反映這些變更。

DynamoDB 支援兩種次要索引：
+ **[全域次要索引](GSI.html)：**一種含分割區索引鍵或排序索引鍵的索引，這些索引鍵可與基礎資料表上的索引鍵不同。全域次要索引之所以視為全域，是因為索引上的查詢可以跨越所有分割區之間基礎資料表中的所有資料。全域次要索引會儲存在基礎資料表以外的專屬分割區空間，且會和基礎資料表分開調整。
+ **[本機次要索引](LSI.html)：**是一種與基礎資料表擁有相同分割區索引鍵但不同排序索引鍵的索引。本機次要索引的「本機」概念是指，本機次要索引的每個分割區都會列入基礎資料表分割區的範圍，其中分割區索引鍵的值皆相同。

如需全域次要索引與本機次要索引的比較，請觀看此影片。

[![AWS Videos](http://img.youtube.com/vi/BkEu7zBWge8/0.jpg)](http://www.youtube.com/watch?v=BkEu7zBWge8)


**Topics**
+ [在 DynamoDB 中使用全域次要索引](GSI.md)
+ [本機次要索引](LSI.md)

當您判斷要使用的索引類型時，應該考量應用程式需求。下列資料表會顯示全域次要索引和本機次要索引之間的主要差異。


****  

| 特性 | 全域次要索引 | 本機次要索引 | 
| --- | --- | --- | 
| 索引鍵結構描述 | 全域次要索引的主索引鍵可以是簡單 (分割區索引鍵) 或複合 (分割區索引鍵和排序索引鍵)。 | 本機次要索引的主索引鍵必須是複合形式 (分割區索引鍵和排序索引鍵)。 | 
| 索引鍵屬性 | 索引的分割區索引鍵和排序索引鍵 (若存在) 可以是字串、數字或二進位類型的任何基礎資料表屬性。 | 索引的分割區索引鍵與基礎資料表的分割區索引鍵具有相同的屬性。排序索引鍵可以是字串、數字或二進位類型的任何基礎資料表屬性。 | 
| 每個分割區索引鍵值的大小限制 | 全域次要索引沒有大小限制。 | 針對每個分割區索引鍵值，所有已索引項目的大小總計必須是 10 GB 或以下。 | 
| 線上索引操作 | 您可在建立資料表的同時建立全域次要索引。您也可以將新的全域次要索引新增至現有的資料表，或刪除現有的全域次要索引。如需詳細資訊，請參閱 [在 DynamoDB 中管理全域次要索引](GSI.OnlineOps.md)。 | 本機次要索引是在建立資料表的同時建立的。您無法對現有資料表新增本機次要索引，也無法刪除現有的任何本機次要索引。 | 
| 查詢和分割區 | 全域次要索引可讓您跨所有分割區查詢整個資料表。 | 本機次要索引可讓您查詢單一分割區 (由查詢中的分割區索引鍵值所指定)。 | 
| 讀取一致性 | 全域次要索引上的查詢僅支援最終一致性。 | 當您查詢本機次要索引時，可以選擇最終一致性或強烈一致性。 | 
| 佈建輸送量耗用 | 針對讀取和寫入活動，每個全域次要索引都有自己的佈建輸送量設定。對全域次要索引的查詢或掃描會使用來自索引的容量單位，而不是來自基礎資料表。這適用於資料表寫入引發的全域次要索引更新。與全域資料表相關聯的全域次要索引會耗用寫入容量單位。 | 對本機次要索引的查詢或掃描會使用來自基礎資料表的讀取容量單位。當您寫入至資料表時，也會一併更新其本機次要索引，且這些更新會使用來自基礎資料表的寫入容量單位。與全域資料表相關聯的本機次要索引會耗用複寫的寫入容量單位。 | 
| 投影屬性 | 您可以使用全域次要索引查詢或掃描來僅請求投影至索引的屬性。DynamoDB 不會從資料表中擷取任何屬性。 | 若要查詢或掃描本機次要索引，您可以請求未投影至索引的屬性。DynamoDB 會自動從資料表中擷取這些屬性。 | 

如果您想要建立具有次要索引的多個資料表，則必須循序進行這項操作。例如，您建立第一個資料表並等待它變成 `ACTIVE`、建立下一個資料表並等待其變成 `ACTIVE`，以此類推。如果您嘗試並行建立具有次要索引的多份資料表，則 DynamoDB 會傳回 `LimitExceededException`。

每個次要索引使用的[資料表類別](HowItWorks.TableClasses.html)和[容量模式](capacity-mode.md)皆與其相關聯的基礎資料表相同。針對每個次要索引，您必須指定下列項目：
+ 要建立的索引類型：全域次要索引或本機次要索引。
+ 索引的名稱。索引的命名規則與資料表的命名規則相同，如「[Amazon DynamoDB 中的配額](ServiceQuotas.md)」中所列。名稱對與其建立關聯的基礎資料表而言必須是唯一的，但您可以將相同的名稱用於與其不同基礎資料表建立關聯的索引。
+ 索引的索引鍵結構描述。索引鍵結構描述中的每個屬性都必須是 `String`、`Number` 或 `Binary` 類型的最上層屬性。不允許其他資料類型 (包含文件和集合)。索引鍵結構描述的其他需求取決於索引類型：
  + 針對全域次要索引，分割區索引鍵可以是基礎資料表的任何純量屬性。排序索引鍵是選用項目，它也可以是基礎資料表的任何純量屬性。
  + 針對本機次要索引，分割區索引鍵必須與基礎資料表的分割區索引鍵相同，而排序索引鍵必須是非索引鍵基礎資料表屬性。
+ 從基礎資料表投影至索引的其他屬性 (如果有的話)。這些是自動投影至每個索引之資料表索引鍵屬性以外的屬性。您可以投影任何資料類型的屬性 (包含純量、文件和集合)。
+ 索引的佈建輸送量設定 (必要時)：
  + 針對全域次要索引，您必須指定讀取和寫入容量單位設定。這些佈建輸送量設定與基礎資料表設定無關。
  + 針對本機次要索引，您不需要指定讀取和寫入容量單位設定。本機次要索引的任何讀取和寫入操作都是取自其基礎資料表的佈建輸送量設定。

為獲得最大的查詢靈活性，您最多可以為每份資料表建立 20 個全域次要索引 (預設配額) 和 5 個本機次要索引。

若要取得資料表次要索引的詳細清單，請使用 `DescribeTable` 操作。`DescribeTable` 會傳回資料表中每個次要索引的名稱、儲存大小和項目計數。這些值不會即時更新，但大約每六小時會重新整理一次。

您可以使用 `Query` 或 `Scan` 操作來存取次要索引中的資料。您必須指定基礎資料表名稱以及您要使用的索引名稱、要在結果中傳回的屬性，以及您要套用的任何條件表達式或篩選條件。DynamoDB 可以依遞增或遞減順序傳回結果。

當您刪除資料表時，也會刪除與該資料表建立關聯的所有索引。

如需最佳實務做法，請參閱「[使用 DynamoDB 中次要索引的最佳實務](bp-indexes.md)」。