- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
Mnesia 有四种读取数据库的方法:read
、match_object
、select
、qlc
。当然,除了他们肮脏的同行。它们中的每一个都比以前的更具表现力。
UPD。如I GIVE CRAP ANSWERS提到,read
只是一个键值查找,但经过一段时间的探索,我发现还有函数 index_read
和 index_write
,它们在方式相同,但使用索引而不是主键。
最佳答案
一次一个,但凭内存:
read
总是在 keypos
上使用 Key-lookup。它基本上是键值查找。match_object
和 select
将在 keypos
键上优化查询。也就是说,它只使用该键进行优化。它从不使用更多的索引类型。qlc
有一个查询编译器,如果可能会尝试使用额外的索引,但这完全取决于查询计划器以及它是否触发。 erl -man qlc
有详细信息,你可以要求它输出它的计划。Mnesia 表基本上是从术语到术语的键值映射。通常,这意味着如果 key 部分是查询可以锁定和使用的东西,那么它就会被使用。否则,您将查看全表扫描。这可能很昂贵,但请注意扫描是在内存中的,因此通常相当快。
另外,请注意表类型:set
是一个哈希表,不能使用部分键匹配。 ordered_set
是一棵树,可以进行部分匹配:
示例 - 如果我们有一个键 {Id, Timestamp}
,则查询 {Id, '_'}
作为键 is在 ordered_set
上相当快,因为字典顺序意味着我们可以利用树进行快速遍历。这相当于在传统 RDBMS 中指定复合 INDEX/PRIMARY KEY。
如果您可以安排数据以便无需额外索引就可以进行简单查询,那么这种表示是首选。另请注意,附加索引是作为包实现的,因此如果一个索引有很多匹配项,那么它的效率非常低。换句话说,您可能不应该对元组中几乎没有不同值的位置进行索引。最好为具有许多不同(大部分)不同值的事物编制索引,例如用户列的电子邮件地址。
关于erlang - Mnesia:read、match_object、select和qlc查询的时间和空间效率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19010047/
在实践中,查询列表理解似乎适用于 Mnesia 和 ets/dets 表的所有用途。是否有任何操作(或操作类型)比 QLC 等效项更有效? (我正在思考 Which is more expensive
如何编写一个 qlc 查询来遍历表直到找到第一个匹配条目?例如,此查询返回表中匹配条件的所有条目: qlc:q([E#stuff.data || E <- mnesia:table(stuff), E
我有这个记录的内存表。 -record(peer, { peer_key, %% key is the tuple {FileId, PeerId} last_seen,
我是一名优秀的程序员,十分优秀!