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

資訊專欄INFORMATION COLUMN

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

bitkylin / 3536人閱讀

摘要:上一節(jié)我們介紹了項(xiàng)目的添加修改獲取刪除操作,這一節(jié)將介紹索引的創(chuàng)建及管理。創(chuàng)建索引在關(guān)系數(shù)據(jù)庫中,索引是一個(gè)數(shù)據(jù)結(jié)構(gòu),可對表中的不同的列執(zhí)行快速查詢。但是,全局二級索引僅支持最終一致性。無論使用的是關(guān)系數(shù)據(jù)庫還是,在創(chuàng)建索引時(shí)都應(yīng)謹(jǐn)慎。

上一節(jié)我們介紹了項(xiàng)目的添加、修改、獲取、刪除(CRUD)操作,這一節(jié)將介紹索引的創(chuàng)建及管理。

創(chuàng)建索引

在關(guān)系數(shù)據(jù)庫中,索引是一個(gè)數(shù)據(jù)結(jié)構(gòu),可對表中的不同的列執(zhí)行快速查詢??梢允褂?CREATE INDEX SQL 語句將索引添加到現(xiàn)有表,并指定要建立索引的列。在創(chuàng)建索引后,可以照常查詢表中的數(shù)據(jù),但現(xiàn)在數(shù)據(jù)庫可使用索引快速查找表中的指定行,而不是掃描整個(gè)表。

在創(chuàng)建一個(gè)索引后,數(shù)據(jù)庫將自動(dòng)維護(hù)此索引。只要修改表中的數(shù)據(jù),就會自動(dòng)更改索引以反映表中的更改。

在 MySQL 中,您可以創(chuàng)建如下所示的索引:

CREATE INDEX GenreAndPriceIndex 
ON Music (genre, price);

在 DynamoDB 中,我們可以創(chuàng)建和使用secondary index來實(shí)現(xiàn)類似目的。

DynamoDB 中的索引與其關(guān)系對應(yīng)項(xiàng)不同。當(dāng)我們創(chuàng)建secondary index時(shí),必須指定其鍵屬性 - 分區(qū)鍵和排序鍵。
在創(chuàng)建secondary index后,我們可以對它執(zhí)行 Query 或 Scan 操作,就如同對表執(zhí)行這些操作一樣。
DynamoDB 沒有查詢優(yōu)化程序,因此,僅在我們對secondary index執(zhí)行 Query 或 Scan 操作時(shí)使用它。

DynamoDB 支持兩種不同的索引:

全局二級索引 - 索引的主鍵可以是其表中的任意兩個(gè)屬性(可以在創(chuàng)建表時(shí)創(chuàng)建,也可以向現(xiàn)有表添加新全局二級索引,或者刪除現(xiàn)有的全局二級索引)。

本地二級索引 - 索引的分區(qū)鍵必須與其表的分區(qū)鍵相同。不過,排序鍵可以是任何其他屬性(是在創(chuàng)建表的同時(shí)創(chuàng)建的。不能向現(xiàn)有表添加本地二級索引,也不能刪除已存在的任何本地二級索引)。

DynamoDB 確保secondary index中的數(shù)據(jù)最終與其表保持一致。我們可以請求對表或local secondary index執(zhí)行強(qiáng)一致性 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
                }
            }
        }
    ]
}

添加索引時(shí)必須向 UpdateTable 提供以下參數(shù):

TableName – 索引將關(guān)聯(lián)到的表。

AttributeDefinitions – 索引的鍵架構(gòu)屬性的數(shù)據(jù)類型。

GlobalSecondaryIndexUpdates – 有關(guān)要?jiǎng)?chuàng)建的索引的詳細(xì)信息:

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"}}

索引擴(kuò)展 管理索引

索引可以訪問替代查詢模式,并可以加快查詢速度。

無論使用的是關(guān)系數(shù)據(jù)庫還是 DynamoDB,在創(chuàng)建索引時(shí)都應(yīng)謹(jǐn)慎。只要對表進(jìn)行寫入,就必須更新表的所有索引。在具有大型表的寫入密集型環(huán)境中,這會占用大量系統(tǒng)資源。

為了對表中的數(shù)據(jù)進(jìn)行高效訪問,Amazon DynamoDB 對主鍵屬性創(chuàng)建并維護(hù)索引。這可以讓應(yīng)用程序通過指定主鍵值快速地檢索數(shù)據(jù)。
可以對表創(chuàng)建一個(gè)或多個(gè)二級索引,然后對這些索引發(fā)出 Query 或 Scan 請求,以便通過主鍵以外的屬性對數(shù)據(jù)進(jìn)行高效訪問。

secondary index 是一種數(shù)據(jù)結(jié)構(gòu),它包含表中屬性的子集以及一個(gè)支持 Query 操作的替代鍵。我們可以使用 Query 從索引中檢索數(shù)據(jù),其方式與對表使用 Query 大致相同。一個(gè)表可以有多個(gè)secondary index,這樣,應(yīng)用程序可以訪問許多不同的查詢模式。

也可以對索引使用 Scan,其方式與對表使用 Scan 大致相同。

secondary index中的數(shù)據(jù)由從表投影 或復(fù)制到索引中的屬性組成。在創(chuàng)建secondary index時(shí),可以定義索引的替代鍵以及要在索引中投影的任何其他屬性。DynamoDB 將這些屬性與表中的主鍵屬性一起復(fù)制到索引中。然后,就可以像查詢或掃描表一樣查詢或掃描該索引。

每個(gè)secondary index都由 DynamoDB 自動(dòng)維護(hù)。在表中添加、修改或刪除項(xiàng)目時(shí),表上的所有索引也會更新。

DynamoDB 支持兩種secondary index:

Global secondary index – 其分區(qū)鍵和排序鍵可以與表上的分區(qū)鍵和排序鍵不同的索引。global secondary index被視為“全局”,是因?yàn)閷λ饕M(jìn)行的查詢可以跨表中所有分區(qū)的所有數(shù)據(jù)。

Local secondary index – 一種分區(qū)鍵與表中的相同但排序鍵與表中的不同的索引。local secondary index的含義是“本地”,表示local secondary index的每個(gè)分區(qū)的范圍都限定為具有相同分區(qū)鍵值的表分區(qū)。

下表是global secondary index與local secondary index的主要差異:


性能 全局二級索引 本地二級索引
鍵架構(gòu) global secondary index的主鍵可以是簡單主鍵(分區(qū)鍵)或復(fù)合主鍵(分區(qū)鍵和排序鍵)。 local secondary index的主鍵必須是復(fù)合主鍵(分區(qū)鍵和排序鍵)。
鍵屬性 索引分區(qū)鍵和排序鍵(如果有)可以是字符串、數(shù)字或二進(jìn)制類型的任何表屬性。 索引的分區(qū)鍵是與表的分區(qū)鍵相同的屬性。排序鍵可以是字符串、數(shù)字或二進(jìn)制類型的任何表屬性。
每個(gè)分區(qū)鍵值的大小限制 global secondary index沒有大小限制。 對于每個(gè)分區(qū)鍵值,所有索引項(xiàng)目的大小總和必須為 10GB 或更小。
在線索引操作 可以在創(chuàng)建表時(shí)創(chuàng)建Global secondary index。也可以向現(xiàn)有表添加新global secondary index,或者刪除現(xiàn)有g(shù)lobal secondary index。 Local secondary index是在創(chuàng)建表的同時(shí)創(chuàng)建的。不能向現(xiàn)有表添加local secondary index,也不能刪除已存在的任何local secondary index。
查詢和分區(qū) 通過global secondary index,可以跨所有分區(qū)查詢整個(gè)表。 借助local secondary index,可以對查詢中分區(qū)鍵值指定的單個(gè)分區(qū)進(jìn)行查詢。
讀取一致性 對global secondary index進(jìn)行的查詢僅支持最終一致性 查詢local secondary index時(shí),可以選擇最終一致性或強(qiáng)一致性。
預(yù)配置吞吐量使用 每個(gè)global secondary index都有自己的用于讀取和寫入活動(dòng)的預(yù)配置吞吐量設(shè)置。對global secondary index進(jìn)行的查詢或掃描會占用索引(而非表)的容量單位。global secondary index更新也是如此,因?yàn)闀M(jìn)行表寫入。 對local secondary index進(jìn)行的查詢或掃描會占用表的讀取容量單位。向表寫入時(shí),其local secondary index也會更新;這些更新會占用表的寫入容量單位。
投影屬性 對于global secondary index查詢或掃描,只能請求投影到索引中的屬性。DynamoDB 不從表提取任何屬性。 如果您查詢或掃描local secondary index,可以請求未投影到索引中的屬性。DynamoDB 自動(dòng)從表提取這些屬性。

如果要?jiǎng)?chuàng)建多個(gè)含有secondary index的表,必須按順序執(zhí)行此操作。例如,先創(chuàng)建第一個(gè)表,等待其狀態(tài)變?yōu)?ACTIVE,創(chuàng)建下一個(gè)表,等待其狀態(tài)變?yōu)?ACTIVE,依此類推。如果我們嘗試同時(shí)創(chuàng)建多個(gè)含有secondary index的表,DynamoDB 會返回 LimitExceededException。

對于每個(gè)secondary index,必須指定以下內(nèi)容:

要?jiǎng)?chuàng)建的索引的類型 – global secondary index或local secondary index。

索引的名稱。索引的命名規(guī)則與表的命名規(guī)則相同,對于聽一個(gè)表的不同索引,索名稱必須是唯一的,不過,與不同的表的索引的名稱可以相同。

索引的鍵架構(gòu)。索引鍵架構(gòu)中的每個(gè)屬性必須是類型為字符串、數(shù)字或二進(jìn)制的頂級屬性。其他數(shù)據(jù)類型,包括文檔和集,均不受支持。鍵架構(gòu)的其他要求取決于索引的類型:

對于global secondary index,分區(qū)鍵可以是任何標(biāo)量表屬性。排序鍵是可選的,也可以是任何標(biāo)量表屬性。

對于local secondary index,分區(qū)鍵必須與表的分區(qū)鍵相同,排序鍵必須是非鍵表屬性。

從表投影到索引中的其他屬性(如果有)必須是除表鍵屬性之外的屬性。(表鍵屬性會自動(dòng)投影到每個(gè)索引)

索引的預(yù)配置吞吐量設(shè)置(如有必要):

對于global secondary index,必須指定讀取和寫入容量單位設(shè)置。這些預(yù)配置吞吐量設(shè)置獨(dú)立于表的設(shè)置。

對于local secondary index,無需指定讀取和寫入容量單位設(shè)置。對local secondary index進(jìn)行的讀取和寫入操作會占用其父表的預(yù)配置吞吐量設(shè)置。

為獲得最大查詢靈活性,您可以為每個(gè)表創(chuàng)建最多 5 個(gè) global secondary index和最多 5 個(gè)local secondary index。

可以使用 DescribeTable 操作獲取表上secondary index的詳細(xì)列表。DescribeTable 返回表上每個(gè)secondary index的名稱、存儲大小和項(xiàng)目數(shù)。系統(tǒng)并不會實(shí)時(shí)更新這些值,但會大約每隔六個(gè)小時(shí)刷新一次。

下一篇將會介紹DynamoDB的查詢和掃描

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/38406.html

相關(guān)文章

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

    摘要:上一節(jié)我們介紹了項(xiàng)目的添加修改獲取刪除操作,這一節(jié)將介紹索引的創(chuàng)建及管理。創(chuàng)建索引在關(guān)系數(shù)據(jù)庫中,索引是一個(gè)數(shù)據(jù)結(jié)構(gòu),可對表中的不同的列執(zhí)行快速查詢。但是,全局二級索引僅支持最終一致性。無論使用的是關(guān)系數(shù)據(jù)庫還是,在創(chuàng)建索引時(shí)都應(yīng)謹(jǐn)慎。 上一節(jié)我們介紹了項(xiàng)目的添加、修改、獲取、刪除(CRUD)操作,這一節(jié)將介紹索引的創(chuàng)建及管理。 創(chuàng)建索引 在關(guān)系數(shù)據(jù)庫中,索引是一個(gè)數(shù)據(jù)結(jié)構(gòu),可對表中的...

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

    摘要:使用配置注冊并創(chuàng)建訪問密鑰創(chuàng)建憑證文件開啟服務(wù)在計(jì)算機(jī)上運(yùn)行除了服務(wù)之外,還提供可本地運(yùn)行的可下載版本的。設(shè)置此參數(shù)有助于更逼真地模擬服務(wù)的行為。目前,此參數(shù)僅為處于或狀態(tài)的引入延遲。原文鏈接安裝及配置 什么是 Amazon DynamoDB Amazon DynamoDB 是一種完全托管的 NoSQL 數(shù)據(jù)庫服務(wù),提供快速而可預(yù)測的性能,能夠?qū)崿F(xiàn)無縫擴(kuò)展。使用 DynamoDB,您可...

    ddongjian0000 評論0 收藏0

發(fā)表評論

0條評論

最新活動(dòng)
閱讀需要支付1元查看
<