使用 SimpleDB 查询项目是否存在的最有效方法是什么? 例如,"是否有具有此邮政编码的用户"?
实际上并没有那么多选择。如果您要查找的属性不是项目名称,则唯一的替代方法是使用选择。有两种可能的方法。首次使用计数(*)
select count(*) from DomainX where AttributeY='ZValue'
或者,使用 itemName(),如果您想在检查存在后检索项目(尽管在这种情况下您可能只是select *
),它可以带来更多好处。
select itemName() from DomainX where AttributeY='ZValue'
此外,还可以选择使用限制
select ..... limit 1
幸运的是,亚马逊通过每个SimpleDB操作返回的BoxUsage值提供了关于什么是最昂贵的提示。我编写了一个小脚本来运行 4 个备选方案中的每一个 25 次(考虑到库预热),并比较每个备选方案的时间和 BoxUsage。使用的域包含大约 4500 个项目,每个项目有 4 个属性。
我的第一遍使用了一个匹配多个项目(11 个项目)的谓词 where 子句。
Type of Query | Avg time(s) | Avg BoxUsage
------------------------------------------------------------
count(*) without limit | 0,092 | 0,0000229400
count(*) with limit 1 | 0,092 | 0,0000228616
itemName() without limit | 0,092 | 0,0000140880
itemName() with limit 1 | 0,090 | 0,0000140080
我的第二次传递使用了仅匹配一个项目的谓词 where 子句
Type of Query | Avg time(s) | Avg BoxUsage
------------------------------------------------------------
count(*) without limit | 0,090 | 0,0000140080
count(*) with limit 1 | 0,091 | 0,0000140080
itemName() without limit | 0,090 | 0,0000140080
itemName() with limit 1 | 0,093 | 0,0000140080
平均时间在统计上并不显着,而且可能不是那么可靠,因为我从我的家庭DSL执行了测试。从 EC2 实例进行测试会更合适。
然而,BoxUsage很有趣。建议 itemName() 比 count(*) 更适合,尽管您必须考虑您的查询是否匹配很多项目(数百个),在这种情况下,您将在 itemName() 情况下产生数据传输的开销,尽管它会更便宜 BoxUse 明智。限制的使用不会对BoxUsage产生很大影响,这并不令人惊讶,因为它用于分页,这意味着您可以通过使用NextMarker重复查询来继续检索更多结果。
如果我在哪里在 simpledb 之上实现通用Exists()
操作,我可能会选择
select itemName() from X where Y='Z' limit 1
如果性能/成本敏感,则应在环境中自行执行测试。