如何在 Erlang Mnesia 中创建和使用(或模拟)多列索引
Posted
技术标签:
【中文标题】如何在 Erlang Mnesia 中创建和使用(或模拟)多列索引【英文标题】:How do I create and use (or simulate) multi-column indexes in Erlang Mnesia 【发布时间】:2011-06-01 05:27:57 【问题描述】:我浏览了 Mnesia 文档和 3 部流行的 Erlang 书籍。似乎只能创建和使用单列主索引和二级索引。或者也许这正是示例所涵盖的内容?如果我在每一列上创建一个单独的索引,Mnesia 是否能够智能地一起使用它们来模拟多列键索引搜索?如果是这样,性能会比简单的表扫描好得多吗?
如果 Mnesia 不支持多列索引,鉴于其原生 dbms,是否有人在 Erlang 中模拟了此功能。
第二个问题:如何模拟约束(引用、检查)、触发器和基于事件的通知?
【问题讨论】:
【参考方案1】:Mnesia 有基于事件的通知。它可能有一个订阅 mnesia 事件的进程(gen_server)。这些事件被分类:表事件、系统事件和其他。阅读有关事件部分的 mnesia 文档。实际上,进程可以通过调用:mnesia:report_event(Event)
来使用 mnesia 事件处理程序报告事件。所有订阅 mnesia 事件的进程都会收到此消息。
Mnesia 将向订阅的进程报告有关表上所有事务的实时信息。可以有读取、写入或删除事务,并且其循环中的进程可以模式匹配它可能感兴趣的事件类型。有详细和简单的表事件。我个人发现这些活动非常有用。您应该能够从文档中获取详细信息。
关于事件。现在 mnesia 表存储相同类型的记录。可以通过调用mnesia:table_info(Table_name::atom(),attributes)
访问此信息。在 mnesia 表上应用索引时,它将接受来自这些属性的任何字段,只要它不是第一个记录字段(通常称为“主键”)。如果在表创建时应用这些索引比在运行时应用更好,因为数量的原因。考虑下面的代码 sn-p
如果我很好地理解了您的问题,我现在可以说表employee 具有列:age、sex、first_name、other_name 和工作索引,并且所有用于基于索引属性进行记录搜索的 mnesia API 都可以工作,例如mnesia:index_read/3 or mnesia:index_match_object/2 or mnesia:index_match_object/4
。祝你好运
/joshmuza@gmail.com
【讨论】:
【参考方案2】:一种方法是将X, Y
直接存储在具有密钥的“列”中。这使您能够快速搜索结构 _, _
的查询,但也意味着当您只知道元组中的一个值时搜索速度较慢(默认情况下,表是哈希表)。
至于您的其他 DBMS 需要:Mnesia 并不是为了取代传统数据库而构建的,而是为了满足爱立信开发人员在编写应用程序时的需求而构建的。因此,如果您的目标是这样的话,将数据存储在传统数据库中可能会更好。
但是,您可以使用 mnesia 周围的代码添加功能 - 如果这是您想要的。
【讨论】:
非常感谢。只是为了更好地理解:使用 table (staff, id, sal, lname, fname, sex, phone 我做 mnesia:add_table_index(staff, sal, lname, fname) 按薪水排序,然后使用元组命名- field sal, lname, fname?Mnesia 是否接受元组表字段和元组索引字段?或者更确切地说,以编程方式手动将我的键字段数据按顺序连接到一个键字段中,我现在将其用作键字段?这听起来有点天真,但我对这一切都很陌生。我愿意尝试一下,并会去尝试这些替代方案,但感谢任何帮助。干杯。Joe Pee 请忽略我的最后一个问题,因为答案很明显。谢谢。以上是关于如何在 Erlang Mnesia 中创建和使用(或模拟)多列索引的主要内容,如果未能解决你的问题,请参考以下文章