Mnesia:读取、match_object、选择和 QLC 查询的时间和空间效率



Mnesia 有四种从数据库中读取的方法:readmatch_objectselectqlc。当然,除了他们肮脏的同行。他们每个人都比以前的更具表现力。

  1. 他们中的哪些使用索引?
  2. 给定其中一个方法中的查询,在更具表现力的方法中的相同查询是否会因时间/内存使用而降低效率?多少?

上。正如我给出废话答案所提到的,read只是一个键值查找,但经过一段时间的探索,我发现还有函数index_readindex_write,它们以相同的方式工作,但使用索引而不是主键。

一次

一个,尽管来自记忆:

  • read总是在keypos上使用密钥查找。它基本上是键值查找。
  • match_objectselect将优化查询(如果可以的话(keypos键。也就是说,它仅使用该键进行优化。它从不使用进一步的索引类型。
  • qlc有一个查询编译器,如果可能的话,会尝试使用其他索引,但这完全取决于查询计划程序以及它是否触发。 erl -man qlc有详细信息,您可以要求它输出其计划。

助记符表基本上是从项到项的键值映射。通常,这意味着如果密钥部分是查询可以锁定和使用的东西,则使用它。否则,您将看到全表扫描。这可能很昂贵,但请注意扫描在内存中,因此通常相当快。

另外,请注意表类型:set 是哈希表,不能使用部分键匹配。 ordered_set是一棵树,可以进行部分匹配:

示例 - 如果我们有一个键{Id, Timestamp},查询{Id, '_'}因为键在ordered_set相当快,因为词典排序意味着我们可以利用树进行快速行走。这相当于在传统的RDBMS中指定复合索引/主键。

如果可以排列数据,以便无需其他索引即可执行简单查询,则首选该表示形式。另请注意,其他索引是作为包实现的,因此如果索引有很多匹配项,则效率非常低。换句话说,您可能不应该在元组中几乎没有不同值的位置上编制索引。最好对具有许多不同(大部分(不同值的内容进行索引,例如用户列的电子邮件地址。

最新更新