Mnesia中的独特约束

时间:2009-06-30 12:52:54

标签: mysql database erlang performance mnesia

我正在开发一个需要大量数据库写入的Erlang应用程序。除了主键之外,我的模式还具有强制执行唯一约束的另一个属性。

说我有一个ID,一个unique_constraint_field和其他一些字段。我现在需要更新DB中对应于唯一ID的行,因为没有其他行应该已经具有我要更新的unique_constraint_field值的值。

由于更新量很大(每次更新只会影响1行)我需要执行,(也需要低延迟)我依靠主键和该属性的唯一约束来捕获重复,而不是使用子查询的更新语句。这允许我在单个查询中执行更新(在95%的时间内发生),在剩余的5%中,我可以捕获异常以对主键或唯一属性违规采取必要的操作。

我目前正在使用ODBC mysql驱动程序。但是,驱动程序返回任何错误的非常一般的错误消息。虽然现在我的原型在我认为任何错误是一个关键违规时工作得很好,但这个模型显然有很多缺陷。我找不到任何其他合适的驱动程序/方式从erlang连接到mysql。

我正在考虑切换到Mnesia(仅限内存模式以满足我的速度要求),因为Erlang和Mnesia如此无缝融合。但是,我看到Mnesia没有任何唯一的键约束,我可以使用它来在单个查询中执行数据库更新。

我需要建议如何最好地在Erlang中实现此要求。有没有办法在Mnesia中执行条件更新?或者,我应该关注其他任何高速数据库替代方案吗?非常感谢任何帮助/见解。

3 个答案:

答案 0 :(得分:2)

除非crash,否则

mnesia可以tune it写入大量的内容。但是您可以使用看起来像{ID, UniqueConstraint}的复杂主键,这可以使您的更新更加简单。还有一个名为osmos的新erlang库,用于专门用于处理高容量写入的磁盘ordered_set表。

答案 1 :(得分:1)

我不知道什么是最佳解决方案,但我要尝试的是将两个表分别用于记录,一个用于索引unique_constraint_field,并在事务中处理CRUD操作中的每个CUD,检查和更新索引。原因是在mnesia中你不能设置索引类型并且始终是重复的包。我认为,因为无论如何你的索引都是唯一的,它不应该引入任何额外的性能损失。如果使用mnesia索引功能,您仍然需要编写自己的CUD操作,结果与使用两个表几乎相同。幸运的是,mnesia以最少的开发人员工作处理嵌套事务,与传统的RDBMS相比,这一点相对容易。

答案 2 :(得分:1)

Ulf Wiger发布了一个库,可让您将mnesia用作关系数据库。它被称为'rdbms',它已经存在了几年,并且在很长一段时间内没有更新,但你可以使用它,或者至少基于他自己的工作来处理它。 Grab the source如果你愿意的话。

他对它的描述:

  

我对我的标准回应感到沮丧   “rdbms”contrib提供了一个解决方案   为此,通过提供支持   复合属性和用户定义的   索引,包括选项   指定索引值必须是   唯一的。

     

Rdbms /已经/已经商业化使用,   但我不认为它准备好了   一般商业用途。我没有   做了很长一段时间,   因为我没有察觉任何用户   压力,但任何想要的人   变化当然欢迎联系   我并争辩他们的案子。

     

http://ulf.wiger.net/rdbms/doc/rdbms.html   (文档留下了很多不足之处,我   知道 - 见上文。)

可以找到提及“唯一”约束的文档here。有性能命中的可能性; mnesia意味着是一个键值存储。我不能完全记住,但是可以定义“唯一”索引在检查时可能涉及全表遍历。

总而言之,因为它已经很久了,你可能无法运行它。请参阅trapexit thread about it。用它来研究它是如何完成的可能是一个更好的主意。