一次一个,虽然来自记忆:
read
总是在keypos
. 它基本上是键值查找。
match_object
并且select
如果可以在keypos
键上优化查询。也就是说,它只使用该键进行优化。它从不使用更多的索引类型。
qlc
有一个查询编译器,如果可能会尝试使用额外的索引,但这完全取决于查询计划器以及它是否触发。erl -man qlc
有详细信息,你可以要求它输出它的计划。
Mnesia 表基本上是从术语到术语的键值映射。通常,这意味着如果关键部分是查询可以锁定和使用的东西,那么它就会被使用。否则,您将查看全表扫描。这可能很昂贵,但请注意扫描是在内存中的,因此通常相当快。
另外,请注意表类型:set
是一个哈希表,不能使用部分键匹配。ordered_set
是一棵树,可以进行部分匹配:
示例 - 如果我们有一个 key {Id, Timestamp}
,在 an 上查询{Id, '_'}
key是相当快的,ordered_set
因为字典顺序意味着我们可以利用树进行快速遍历。这等效于在传统 RDBMS 中指定复合 INDEX/PRIMARY KEY。
如果您可以安排数据以便无需额外索引就可以进行简单查询,那么这种表示是首选。另请注意,附加索引是作为包实现的,因此如果一个索引有很多匹配项,那么它的效率非常低。换句话说,您可能不应该对元组中几乎没有不同值的位置进行索引。最好对具有许多不同(大部分)不同值的事物进行索引,例如用户列的电子邮件地址。