成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Amazon DynamoDB 入門5:索引創(chuàng)建及管理

sewerganger / 3039人閱讀

摘要:上一節(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),可對表中的不同的列執(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

相關(guān)文章

  • Amazon DynamoDB 入門5索引創(chuàng)建管理

    摘要:上一節(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),可對表中的...

    bitkylin 評論0 收藏0
  • Amazon DynamoDB 入門1: 配置(本地)python示例

    摘要:使用配置注冊并創(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,您可...

    ddongjian0000 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<