【发布时间】:2011-12-22 02:48:11
【问题描述】:
我有记录:
-record(bigdata, {mykey,some1,some2}).
正在做一个
mnesia:match_object({bigdata, mykey, some1,'_'})
获取超过 5000 行的最快方法?
澄清: 创建“自定义”键是一种选择(因此我可以进行读取),但是在单个键上进行 5000 次读取是否比 match_object 最快?
【问题讨论】:
我有记录:
-record(bigdata, {mykey,some1,some2}).
正在做一个
mnesia:match_object({bigdata, mykey, some1,'_'})
获取超过 5000 行的最快方法?
澄清: 创建“自定义”键是一种选择(因此我可以进行读取),但是在单个键上进行 5000 次读取是否比 match_object 最快?
【问题讨论】:
我很好奇您正在解决的问题、表格中有多少行等等,如果没有这些信息,这可能不是一个相关的答案,但是......
如果你有一个包,那么最好在键上使用 read/2 然后遍历返回的记录列表。如果可能,最好对数据进行结构化以避免选择和匹配。
通常 select/2 比 match_object 更受欢迎,因为它倾向于更好地避免全表扫描。此外,假设您不需要事务支持,dirty_select 将比 select/2 更快。而且,如果您可以忍受这些限制,Mensa 允许您直接使用底层 ets 表,这非常快,但请查看文档,因为它仅适用于非常罕见的情况。
【讨论】:
Mnesia 更像是一个键值存储系统,它会遍历它的所有记录以获取匹配。
要快速获取,您应该设计存储结构以直接支持查询。将some1 设为键或索引。然后通过read 或index_read 获取它们。
【讨论】:
Fastest Way 到 return more than 5000 rows 的声明取决于所讨论的问题。什么是数据库结构?我们想要什么 ?什么是记录结构?然后,归结为您如何编写读取函数。如果我们确定主键,那么我们使用mnesia:read/1 or mnesia:read/2,如果没有,使用Query List comprehensions更好更漂亮。它更灵活地搜索嵌套记录和复杂的条件查询。请参阅下面的用法:
所以我认为如果你想要最快的方式,我们需要更多的澄清和问题细节。亲爱的,速度取决于很多因素!
【讨论】: