首页手机dynaform实例教程 dynamodb实例

dynaform实例教程 dynamodb实例

圆圆2025-10-13 14:02:27次浏览条评论

dynamodb稀疏全局二级索引:实现条件性数据索引的策略

论文研究如何在亚马逊进行讨论DynamoDB 中利用稀疏全局顶级索引(GSI)实现数据的条件性。通过在主表项中动态添加或删除索引作为 GSI 分区键的特定属性,可以精确控制哪些记录被包含在 GSI 中。这种策略允许在特定业务逻辑条件下自动增删索引记录,从而优化效率、降低成本,尤其适用于需要根据字段值筛选索引数据的复杂场景。DynamoDB GSI 的索引查询机制与限制

Amazon DynamoDB的全局二级索引(GSI)是一个强大的工具,它允许用户根据主表中的非主键属性进行查询。然而,GSI本身并不直接支持基于复杂表达式的条件性投影定义。这意味着,你不能简单地制定一个规则,例如“只有当isIntermediateState字段为1时才将记录添加到GSI中”。GSI的投影模式(KEYS_ONLY, INCLUDE, ALL)决定了哪些属性会从主表复制到索引中,但不会根据属性值来决定是否将整个记录包含在索引中。

当一个GSI被创建时,DynamoDB会检查主表中的每个项目。如果一个包含项目GSI中定义为分区键(Partition Key)和/或排序键(Sort) Key)的属性,那么该项目的一个副本(根据投影设置)就会被添加到GSI中。项目如果不包含这些关键属性,则该项目不会被索引。正是这种行为,为我们实现条件性索引提供了基础。稀疏GSI条件:索引的核心机制

实现条件性数据索引的关键利用稀疏全局稀疏索引(稀疏)稀疏GSI的核心思想是:只要在满足特定条件的记录中,显式地添加一个GSI分区键的辅助属性。当这个辅助属性存在时,记录就会被包含在GSI中;当这个属性不存在时,记录键就不会被包含在GSI中。

其工作原理百年为:定义GSI: 创建一个GSI,将其分区键指定为一个在主表中可能也可能不存在的辅助属性。条件性添加/删除辅助属性:在应用程序逻辑中,根据业务需求选择主表中的记录是否应该被索引。如果记录被索引,则需要在更新主表时,同时为该记录存在添加(或设置)这个辅助属性。如果记录不再需要被索引,则在更新主表时,从该记录中删除这个辅助属性。DynamoDB自动维护: DynamoDB会自动检测主表项中GSI分区键属性的存在与否。当该属性被添加或移除时,GSI会相应地自动更新,将记录包含或排除在外部。实践案例:基于状态的条件索引

我们以一个具体的场景为例:假设有一个Attachment表,其中包含customerState(客户状态,如Attaching,Detaching,Attached, Detached)和isIntermediateState(是否为中间状态,1表示中间状态,0表示最终状态)字段。我们的目标是创建一个GSI,只索引isIntermediateState = 1的记录,并处于状态为IntermediateState = 0时自动从GSI中移除。1. 设计GSI分区键

首先,我们需要在Attachment表的基础上创建一个GSI。我们将定义一个辅助属性,例如IntermediateStatePK,作为这个GSI的分区键。

这个IntermediateStatePK的值可以是一个固定的字符串,例如“INTERMEDIATE”,只要它存在就表示该记录应该被索引。

GSI配置示例:GSI名称:IntermediateAttachmentsIndex分区键:IntermediateStatePK(类型:String)排序键(任选):可以根据需要选择其他属性,如attachmentId。投影属性:根据需求查询选择KEYS_ONLY、INCLUDE、或ALL。2. 实现条件性更新

应用程序在更新附件表中的记录时,需要根据customerState或isIntermediateState的值来决定是否操作IntermediateStatePK属性。

场景一:记录进入中间状态(需要被索引)纳米搜索

纳米搜索:360推出的新一代AI搜索引擎 30 查看详情

当customerState达到Attaching或Detaching,导致isIntermediateState达到1时,我们需要在主表项中添加IntermediateStatePK属性。

示例代码(使用AWS SDK for JavaScript v3的UpdateCommand):import { DynamoDBClient } from quot;@aws-sdk/client-dynamodbquot;;import { DynamoDBDocumentClient, UpdateCommand } from quot;@aws-sdk/lib-dynamodbquot;;const client = new DynamoDBClient({});const docClient = DynamoDBDocumentClient.from(client);async function updateAttachmentToIntermediate(attachmentId, newCustomerState) { const isIntermediate = (newCustomerState === 'Attaching' || newCustomerState === 'Detaching') ? 1 : 0; const params = { TableName: ";Attachmentquot;, Key: { attachmentId: attachmentId }, UpdateExpression: ";SET #cs = :cs_val, #is = :is_val, #ispk = :ispk_valquot;, ExpressionAttributeNames: { quot;#csquot;: ";customerStatequot;, quot;#isquot;: ";isIntermediateStatequot;, quot;#ispkquot;: ";IntermediateStatePKquot; // GSI分区键属性 }, ExpressionAttributeValues: { quot;:cs_valquot;: newCustomerState, quot;:is_valquot;: isIntermediate, quot;:ispk_valquot;: ";INTERMEDIATEquot; // 显式设置GSI分区键 }, ReturnValues: ";ALL_NEWquot; }; try { const data = await docClient.send(new UpdateCommand(params)); console.log(quot;附件已更新至中间状态:quot;, data.Attributes); } catch (error) { console.error(quot;更新附件时出错:quot;, error); }}// 示例调用// updateAttachmentToIntermediate(quot;attachment-123quot;, qu

ot;Attachingquot;);登录后复制

场景二:记录进入最终状态(需要从GSI中删除)

当customerState变为Attached或Detached,导致isIntermediateState变为0时,我们从需要主表项中删除IntermediateStatePK属性。

示例代码(使用AWS SDK for JavaScript v3的UpdateCommand):import { DynamoDBClient } from quot;@aws-sdk/client-dynamodbquot;;import { DynamoDBDocumentClient, UpdateCommand } from quot;@aws-sdk/lib-dynamodbquot;;const client = new DynamoDBClient({});const docClient = DynamoDBDocumentClient.from(client);async function updateAttachmentToFinal(attachmentId, newCustomerState) { const isIntermediate = (newCustomerState === 'Attaching' || newCustomerState === 'Detaching') ? 1 : 0; //此时应为0 const params = { TableName: quot;Attachmentquot;, Key: { attachmentId: attachmentId }, UpdateExpression: quot;SET #cs = :cs_val, #is = :is_val REMOVE #ispkquot;, ExpressionAttributeNames: { quot;#csquot;: quot;customerStatequot;, quot;#isquot;: quot;isIntermediateStatequot;, quot;#ispkquot;: quot;IntermediateStatePKquot; // GSI分区键属性 }, ExpressionAttributeValues: { quot;:cs_valquot;: newCustomerState, quot;:is_valquot;: isIntermediate, }, ReturnValues: quot;ALL_NEWquot; }; try { const data = await docClient.send(new UpdateCommand(params)); console.log(quot;Attachment updated to final state, removed from GSI:quot;, data.Attributes); } catch (error) { console.error(quot;更新附件时出错:quot;, error); }}// 引用调用// updateAttachmentToFinal(quot;attachment-123quot;, quot;Attachedquot;);登录后复制3. 查询稀疏GSI

一旦GSI被正确维护,您可以通过查询Inter

mediateAttachmentsIndex来获取所有处于中间状态的附件:import { DynamoDBClient } from quot;@aws-sdk/client-dynamodbquot;;import { DynamoDBDocumentClient, QueryCommand } from quot;@aws-sdk/lib-dynamodbquot;;const client = new DynamoDBClient({});const docClient = DynamoDBDocumentClient.from(client);async function queryIntermediateAttachments() { const params = { TableName: quot;Attachmentquot;, IndexName: quot;IntermediateAttachmentsIndexquot;, // GSI名称 KeyConditionExpression: quot;#ispk = :ispk_valquot;, ExpressionAttributeNames: { quot;#ispkquot;: quot;IntermediateStatePKquot; }, ExpressionAttributeValues: { quot;:ispk_valquot;: quot;INTERMEDIATEquot; } }; try { const data = wait docClient.send(new QueryCommand(params)); console.log(quot;中间附件:quot;, data.Items); return data.Items; } catch (error) { console.error(quot;查询中间附件出错:quot;, error); }}// 尾调用// queryIntermediateAttachments();登录后复制GSI的自动更新行为

关于GSI的机制更新,需要明确的是:DynamoDB GSI是完全托管且异步更新的。持续更新:当主表中的一个项目键被修改时,DynamoDB会异步将这些修改传播到所有相关的GSI。这包括GSI分区或排序键属性的添加、修改或重新添加。决定是否索引: GSI是否包含某个项目,完全依赖该项目是否包含GSI定义中作为分区键和/或排序键的属性。这个判断是在每次主表项目更新时动态进行的。如果主表项目更新后,增加了GSI键分区属性,则该项目会被添加到GSI中。如果主表项目更新后,删除了GSI分区键属性,则该项目会从GSI中删除。如果主表项目更新后,GSI分区键属性的值发生变化,则GSI中的对应项目会被更新。

因此,你不需要担心GSI只在最初添加记录时才是否索引。只要主表中的属性发生变化,GSI就会相关自动且持续地进行更新。

总结与事项注意核心思想:利用GSI分区键属性的存在性来控制记录是否被索引。数据一致性:GSI是最终一致的。这意味着主表更新后,GSI可能需要几秒钟到几秒钟来反应这些变化。在强一致性的情况下,需要额外考虑。成本考量:稀疏GSI可以有效减少GSI中的项目数量,从而降低GSI的存储和容量容量单位(RCU/WCU)消耗,因为只为需要查询的子集支付费用。设计辅助属性:选择一个明确的、有意义的辅助属性名称作为GSI的分区键。其值通常可以是一个固定的字符串,只要的存在与否能够表达索引即可。应用程序逻辑:确保应用程序在更新主表时,始终正确管理该辅助GSI分区按键属性的添加或删除,以保证GSI的准确性。避免过度索引: 偏差确实需要的查询模式创建GSI。过多的GSI增加会存储存储成本和主表写入时的开销。

通过这种稀疏GSI的策略,DynamoDB用户能够灵活地实现复杂的条件性索引需求,极大地优化特定查询模式的性能和效率。

以上就是DynamoDB全局稀疏索引:实现条件性数据索引的策略的详细内容,更多请关注乐哥常识网其他相关文章!字符串排序包含字符串异步大家都看:HTML表单中按钮行为解析:避免JavaScript事件冲突的陷阱纯JavaScript动态添加Bootstrap Toggle开关组件教程使用纯JavaScript添加动态Bootstrap Toggle开关纯使用JavaScript动态添加Bootstrap Toggle开关JavaScript中非实现阻止“无限循环”的策略与实践

DynamoDB稀疏
vscode设置python版本 vscode设置python虚拟环境
相关内容
发表评论

游客 回复需填写必要信息