摘要:上一節(jié)我們介紹了項目的添加修改獲取刪除操作,這一節(jié)將介紹索引的創(chuàng)建及管理。創(chuàng)建索引在關(guān)系數(shù)據(jù)庫中,索引是一個數(shù)據(jù)結(jié)構(gòu),可對表中的不同的列執(zhí)行快速查詢。但是,全局二級索引僅支持最終一致性。無論使用的是關(guān)系數(shù)據(jù)庫還是,在創(chuàng)建索引時都應(yīng)謹(jǐn)慎。
創(chuàng)建索引上一節(jié)我們介紹了項目的添加、修改、獲取、刪除(CRUD)操作,這一節(jié)將介紹索引的創(chuàng)建及管理。
在關(guān)系數(shù)據(jù)庫中,索引是一個數(shù)據(jù)結(jié)構(gòu),可對表中的不同的列執(zhí)行快速查詢??梢允褂?CREATE INDEX SQL 語句將索引添加到現(xiàn)有表,并指定要建立索引的列。在創(chuàng)建索引后,可以照常查詢表中的數(shù)據(jù),但現(xiàn)在數(shù)據(jù)庫可使用索引快速查找表中的指定行,而不是掃描整個表。
在創(chuàng)建一個索引后,數(shù)據(jù)庫將自動維護此索引。只要修改表中的數(shù)據(jù),就會自動更改索引以反映表中的更改。
在 MySQL 中,您可以創(chuàng)建如下所示的索引:
CREATE INDEX GenreAndPriceIndex ON Music (genre, price);
在 DynamoDB 中,我們可以創(chuàng)建和使用secondary index來實現(xiàn)類似目的。
DynamoDB 中的索引與其關(guān)系對應(yīng)項不同。當(dāng)我們創(chuàng)建secondary index時,必須指定其鍵屬性 - 分區(qū)鍵和排序鍵。
在創(chuàng)建secondary index后,我們可以對它執(zhí)行 Query 或 Scan 操作,就如同對表執(zhí)行這些操作一樣。
DynamoDB 沒有查詢優(yōu)化程序,因此,僅在我們對secondary index執(zhí)行 Query 或 Scan 操作時使用它。
DynamoDB 支持兩種不同的索引:
全局二級索引 - 索引的主鍵可以是其表中的任意兩個屬性(可以在創(chuàng)建表時創(chuàng)建,也可以向現(xiàn)有表添加新全局二級索引,或者刪除現(xiàn)有的全局二級索引)。
本地二級索引 - 索引的分區(qū)鍵必須與其表的分區(qū)鍵相同。不過,排序鍵可以是任何其他屬性(是在創(chuàng)建表的同時創(chuàng)建的。不能向現(xiàn)有表添加本地二級索引,也不能刪除已存在的任何本地二級索引)。
DynamoDB 確保secondary index中的數(shù)據(jù)最終與其表保持一致。我們可以請求對表或local secondary index執(zhí)行強一致性 Query 或 Scan 操作。但是,全局二級索引僅支持最終一致性。
可使用 UpdateTable 操作并指定 GlobalSecondaryIndexUpdates 來將global secondary index添加到現(xiàn)有表:
{ TableName: "Music", AttributeDefinitions:[ {AttributeName: "Genre", AttributeType: "S"}, {AttributeName: "Price", AttributeType: "N"} ], GlobalSecondaryIndexUpdates: [ { Create: { IndexName: "GenreAndPriceIndex", KeySchema: [ {AttributeName: "Genre", KeyType: "HASH"}, //Partition key {AttributeName: "Price", KeyType: "RANGE"}, //Sort key ], Projection: { "ProjectionType": "ALL" }, ProvisionedThroughput: { "ReadCapacityUnits": 1,"WriteCapacityUnits": 1 } } } ] }
添加索引時必須向 UpdateTable 提供以下參數(shù):
TableName – 索引將關(guān)聯(lián)到的表。
AttributeDefinitions – 索引的鍵架構(gòu)屬性的數(shù)據(jù)類型。
GlobalSecondaryIndexUpdates – 有關(guān)要創(chuàng)建的索引的詳細信息:
IndexName - 索引的名稱。
KeySchema – 用于索引主鍵的屬性。
Projection - 表中要復(fù)制到索引的屬性。在此情況下,ALL 意味著復(fù)制所有屬性。
ProvisionedThroughput – 每秒需對此索引執(zhí)行的讀取和寫入次數(shù)。(它與表的預(yù)配置吞吐量設(shè)置是分開的。)
在此操作中,會將表中的數(shù)據(jù)回填到新索引。在回填期間,表保持可用。但索引未準(zhǔn)備就緒,直至其 Backfilling 屬性從 true 變?yōu)?false。您可以使用 DescribeTable 操作查看此屬性。
python 示例boto3
import boto3 db3 = boto3.resource("dynamodb", endpoint_url="http://localhost:8000", region_name="us-west-2") table = db3.meta.client.update_table( TableName="Music", AttributeDefinitions=[ { "AttributeName": "Genre", "AttributeType": "S" }, { "AttributeName": "Price", "AttributeType": "N" } ], GlobalSecondaryIndexUpdates=[ { "Create": { "IndexName": "GenreAndPriceIndex", "KeySchema": [ {"AttributeName": "Genre", "KeyType": "HASH"}, # Partition key {"AttributeName": "Price", "KeyType": "RANGE"}, # Sort key ], "Projection": { "ProjectionType": "ALL" }, "ProvisionedThroughput": { "ReadCapacityUnits": 10,"WriteCapacityUnits": 10 } } } ] ) db3.meta.client.describe_table(TableName="Music")
output
{"ResponseMetadata": {"HTTPHeaders": {"content-length": "1082", "content-type": "application/x-amz-json-1.0", "server": "Jetty(8.1.12.v20130726)", "x-amz-crc32": "3717567836", "x-amzn-requestid": "d63c0176-8257-428b-b6f3-af87219ba45b"}, "HTTPStatusCode": 200, "RequestId": "d63c0176-8257-428b-b6f3-af87219ba45b", "RetryAttempts": 0}, u"Table": {u"AttributeDefinitions": [{u"AttributeName": u"Artist", u"AttributeType": u"S"}, {u"AttributeName": u"Price", u"AttributeType": u"N"}, {u"AttributeName": u"SongTitle", u"AttributeType": u"S"}, {u"AttributeName": u"Genre", u"AttributeType": u"S"}], u"CreationDateTime": datetime.datetime(2017, 1, 14, 3, 9, 42, 63000, tzinfo=tzlocal()), u"GlobalSecondaryIndexes": [{u"IndexArn": u"arn:aws:dynamodb:ddblocal:000000000000:table/Music/index/GenreAndPriceIndex", u"IndexName": u"GenreAndPriceIndex", u"IndexSizeBytes": 0, u"IndexStatus": u"ACTIVE", u"ItemCount": 0, u"KeySchema": [{u"AttributeName": u"Genre", u"KeyType": u"HASH"}, {u"AttributeName": u"Price", u"KeyType": u"RANGE"}], u"Projection": {u"ProjectionType": u"ALL"}, u"ProvisionedThroughput": {u"ReadCapacityUnits": 10, u"WriteCapacityUnits": 10}}], u"ItemCount": 0, u"KeySchema": [{u"AttributeName": u"Artist", u"KeyType": u"HASH"}, {u"AttributeName": u"SongTitle", u"KeyType": u"RANGE"}], u"ProvisionedThroughput": {u"LastDecreaseDateTime": datetime.datetime(1970, 1, 1, 8, 0, tzinfo=tzlocal()), u"LastIncreaseDateTime": datetime.datetime(1970, 1, 1, 8, 0, tzinfo=tzlocal()), u"NumberOfDecreasesToday": 0, u"ReadCapacityUnits": 10, u"WriteCapacityUnits": 10}, u"TableArn": u"arn:aws:dynamodb:ddblocal:000000000000:table/Music", u"TableName": u"Music", u"TableSizeBytes": 0, u"TableStatus": u"ACTIVE"}}
索引可以訪問替代查詢模式,并可以加快查詢速度。
無論使用的是關(guān)系數(shù)據(jù)庫還是 DynamoDB,在創(chuàng)建索引時都應(yīng)謹(jǐn)慎。只要對表進行寫入,就必須更新表的所有索引。在具有大型表的寫入密集型環(huán)境中,這會占用大量系統(tǒng)資源。
為了對表中的數(shù)據(jù)進行高效訪問,Amazon DynamoDB 對主鍵屬性創(chuàng)建并維護索引。這可以讓應(yīng)用程序通過指定主鍵值快速地檢索數(shù)據(jù)。
可以對表創(chuàng)建一個或多個二級索引,然后對這些索引發(fā)出 Query 或 Scan 請求,以便通過主鍵以外的屬性對數(shù)據(jù)進行高效訪問。
secondary index 是一種數(shù)據(jù)結(jié)構(gòu),它包含表中屬性的子集以及一個支持 Query 操作的替代鍵。我們可以使用 Query 從索引中檢索數(shù)據(jù),其方式與對表使用 Query 大致相同。一個表可以有多個secondary index,這樣,應(yīng)用程序可以訪問許多不同的查詢模式。
也可以對索引使用 Scan,其方式與對表使用 Scan 大致相同。
secondary index中的數(shù)據(jù)由從表投影 或復(fù)制到索引中的屬性組成。在創(chuàng)建secondary index時,可以定義索引的替代鍵以及要在索引中投影的任何其他屬性。DynamoDB 將這些屬性與表中的主鍵屬性一起復(fù)制到索引中。然后,就可以像查詢或掃描表一樣查詢或掃描該索引。
每個secondary index都由 DynamoDB 自動維護。在表中添加、修改或刪除項目時,表上的所有索引也會更新。
DynamoDB 支持兩種secondary index:
Global secondary index – 其分區(qū)鍵和排序鍵可以與表上的分區(qū)鍵和排序鍵不同的索引。global secondary index被視為“全局”,是因為對索引進行的查詢可以跨表中所有分區(qū)的所有數(shù)據(jù)。
Local secondary index – 一種分區(qū)鍵與表中的相同但排序鍵與表中的不同的索引。local secondary index的含義是“本地”,表示local secondary index的每個分區(qū)的范圍都限定為具有相同分區(qū)鍵值的表分區(qū)。
下表是global secondary index與local secondary index的主要差異:
性能 | 全局二級索引 | 本地二級索引 |
---|---|---|
鍵架構(gòu) | global secondary index的主鍵可以是簡單主鍵(分區(qū)鍵)或復(fù)合主鍵(分區(qū)鍵和排序鍵)。 | local secondary index的主鍵必須是復(fù)合主鍵(分區(qū)鍵和排序鍵)。 |
鍵屬性 | 索引分區(qū)鍵和排序鍵(如果有)可以是字符串、數(shù)字或二進制類型的任何表屬性。 | 索引的分區(qū)鍵是與表的分區(qū)鍵相同的屬性。排序鍵可以是字符串、數(shù)字或二進制類型的任何表屬性。 |
每個分區(qū)鍵值的大小限制 | global secondary index沒有大小限制。 | 對于每個分區(qū)鍵值,所有索引項目的大小總和必須為 10GB 或更小。 |
在線索引操作 | 可以在創(chuàng)建表時創(chuàng)建Global secondary index。也可以向現(xiàn)有表添加新global secondary index,或者刪除現(xiàn)有g(shù)lobal secondary index。 | Local secondary index是在創(chuàng)建表的同時創(chuàng)建的。不能向現(xiàn)有表添加local secondary index,也不能刪除已存在的任何local secondary index。 |
查詢和分區(qū) | 通過global secondary index,可以跨所有分區(qū)查詢整個表。 | 借助local secondary index,可以對查詢中分區(qū)鍵值指定的單個分區(qū)進行查詢。 |
讀取一致性 | 對global secondary index進行的查詢僅支持最終一致性。 | 查詢local secondary index時,可以選擇最終一致性或強一致性。 |
預(yù)配置吞吐量使用 | 每個global secondary index都有自己的用于讀取和寫入活動的預(yù)配置吞吐量設(shè)置。對global secondary index進行的查詢或掃描會占用索引(而非表)的容量單位。global secondary index更新也是如此,因為會進行表寫入。 | 對local secondary index進行的查詢或掃描會占用表的讀取容量單位。向表寫入時,其local secondary index也會更新;這些更新會占用表的寫入容量單位。 |
投影屬性 | 對于global secondary index查詢或掃描,只能請求投影到索引中的屬性。DynamoDB 不從表提取任何屬性。 | 如果您查詢或掃描local secondary index,可以請求未投影到索引中的屬性。DynamoDB 自動從表提取這些屬性。 |
如果要創(chuàng)建多個含有secondary index的表,必須按順序執(zhí)行此操作。例如,先創(chuàng)建第一個表,等待其狀態(tài)變?yōu)?ACTIVE,創(chuàng)建下一個表,等待其狀態(tài)變?yōu)?ACTIVE,依此類推。如果我們嘗試同時創(chuàng)建多個含有secondary index的表,DynamoDB 會返回 LimitExceededException。
對于每個secondary index,必須指定以下內(nèi)容:
要創(chuàng)建的索引的類型 – global secondary index或local secondary index。
索引的名稱。索引的命名規(guī)則與表的命名規(guī)則相同,對于聽一個表的不同索引,索名稱必須是唯一的,不過,與不同的表的索引的名稱可以相同。
索引的鍵架構(gòu)。索引鍵架構(gòu)中的每個屬性必須是類型為字符串、數(shù)字或二進制的頂級屬性。其他數(shù)據(jù)類型,包括文檔和集,均不受支持。鍵架構(gòu)的其他要求取決于索引的類型:
對于global secondary index,分區(qū)鍵可以是任何標(biāo)量表屬性。排序鍵是可選的,也可以是任何標(biāo)量表屬性。
對于local secondary index,分區(qū)鍵必須與表的分區(qū)鍵相同,排序鍵必須是非鍵表屬性。
從表投影到索引中的其他屬性(如果有)必須是除表鍵屬性之外的屬性。(表鍵屬性會自動投影到每個索引)
索引的預(yù)配置吞吐量設(shè)置(如有必要):
對于global secondary index,必須指定讀取和寫入容量單位設(shè)置。這些預(yù)配置吞吐量設(shè)置獨立于表的設(shè)置。
對于local secondary index,無需指定讀取和寫入容量單位設(shè)置。對local secondary index進行的讀取和寫入操作會占用其父表的預(yù)配置吞吐量設(shè)置。
為獲得最大查詢靈活性,您可以為每個表創(chuàng)建最多 5 個 global secondary index和最多 5 個local secondary index。
可以使用 DescribeTable 操作獲取表上secondary index的詳細列表。DescribeTable 返回表上每個secondary index的名稱、存儲大小和項目數(shù)。系統(tǒng)并不會實時更新這些值,但會大約每隔六個小時刷新一次。
下一篇將會介紹DynamoDB的查詢和掃描
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/17584.html
摘要:上一節(jié)我們介紹了項目的添加修改獲取刪除操作,這一節(jié)將介紹索引的創(chuàng)建及管理。創(chuàng)建索引在關(guān)系數(shù)據(jù)庫中,索引是一個數(shù)據(jù)結(jié)構(gòu),可對表中的不同的列執(zhí)行快速查詢。但是,全局二級索引僅支持最終一致性。無論使用的是關(guān)系數(shù)據(jù)庫還是,在創(chuàng)建索引時都應(yīng)謹(jǐn)慎。 上一節(jié)我們介紹了項目的添加、修改、獲取、刪除(CRUD)操作,這一節(jié)將介紹索引的創(chuàng)建及管理。 創(chuàng)建索引 在關(guān)系數(shù)據(jù)庫中,索引是一個數(shù)據(jù)結(jié)構(gòu),可對表中的...
摘要:使用配置注冊并創(chuàng)建訪問密鑰創(chuàng)建憑證文件開啟服務(wù)在計算機上運行除了服務(wù)之外,還提供可本地運行的可下載版本的。設(shè)置此參數(shù)有助于更逼真地模擬服務(wù)的行為。目前,此參數(shù)僅為處于或狀態(tài)的引入延遲。原文鏈接安裝及配置 什么是 Amazon DynamoDB Amazon DynamoDB 是一種完全托管的 NoSQL 數(shù)據(jù)庫服務(wù),提供快速而可預(yù)測的性能,能夠?qū)崿F(xiàn)無縫擴展。使用 DynamoDB,您可...
閱讀 506·2021-09-03 00:22
閱讀 1380·2021-08-03 14:03
閱讀 2098·2021-07-25 21:37
閱讀 657·2019-08-30 13:18
閱讀 1887·2019-08-29 16:19
閱讀 2694·2019-08-29 13:22
閱讀 1307·2019-08-29 12:16
閱讀 2595·2019-08-26 12:16