从mnesia中选择随机记录

时间:2011-06-01 01:03:18

标签: database erlang mnesia

我有一个mnesia表t,其中包含一个包含单个字段x的记录。如何从x中选择随机值t

为了避免数学迂腐的整个过程:我不关心随机数生成的细节,我只想让我的结果每次都不一样。

谢谢,
-tjw

2 个答案:

答案 0 :(得分:5)

不是很有效但会奏效:

  1. 生成随机整数X
  2. 获取桌面大小
  3. 使用mnesia:first
  4. 获取指针
  5. 迭代X次以随机记录
  6. 查询记录
  7. 更复杂:

    1. 创建包含整数
    2. 的额外字段
    3. 整数在设置
    4. 时递增
    5. 在额外字段上创建索引
    6. 随机数X
    7. 脏读取索引行,其中X为键
    8. 再来一次:

      1. 使用int作为主键
      2. random int
      3. 检索行
      4. 每个解决方案都有重要的错误:并发写入性能,读取开销等。

答案 1 :(得分:4)

使用mnesia:all_keys/1(或脏等效)函数和random模块。

random_value(Table) ->
    Keys = mnesia:dirty_all_keys(Table),
    Key = lists:nth(random:uniform(length(Keys)), Keys),
    [#record{x = X}] = mnesia:dirty_read({Table, Key}),
    X.

不要忘记使用random:seed/3初始化种子。