有一个小问题:
想象一个表
ExternalId | Guid
--------------------------------
some1 | accf-0334-dfdf-....
现在,扭曲是规模。我们希望像这样映射数十亿个externalIds,我们需要能够快速分配这些标识符(千/秒)
我们从一个简单的SQL Server表开始,但效果不佳。我们将相同的模式移动到Cassandra ColumnFamily - 写入速度超快且分片但是:在写入之前我们必须读取(以确保externalId尚未分配),因此我们再次达到读取搜索I / O限制。 / p> 遗憾的是,Hashing(以确定uniqueidentifier)是不可能的,因为我们已经分配了数亿。缓存是有问题的,因为在大多数情况下,我们正在分配一个'全新的externalId',因此根本不会在数据库中。
有人对此解决方案有任何建议吗?
答案 0 :(得分:1)
使用SQL server,并像这样创建表:
IGNORE_DUP_KEY = ON
在这种情况下,您始终执行相同的两个(超快速)操作:
1 - 插入ExternalID
2 - 查询GUID
ExternalID
它不允许重复,但它们不会抛出错误。由于聚集索引,它也将是一个高度优化的搜索。
您需要经常重建索引,因为随着时间的推移,您将获得高度的碎片(因为您在非增量varchar上进行聚类),但它应该满足您的其他要求。
答案 1 :(得分:0)
这是一个有趣的问题,老实说,超出了我的知识范围。但是,我发现它很有趣,偶然发现了这个链接 - http://blogs.msdn.com/b/miah/archive/2008/02/17/sql-if-exists-update-else-insert.aspx
似乎此方法会跳过初始全表扫描,这会提高性能。这不是最好的答案,但也许您可以自定义用于特定数据库实现的一般想法。 (我从来没有听说过Cassandra,所以看起来我需要做一些研究。)即使它没有,也可能会给你一些想法(我希望)。不知道你是否尝试过这样的东西,但我想我会分享这个链接。祝你好运。