2011-12-19 18 views
1

を私はレコードを持っている:はMnesiaから大量のデータを取得する - 最速の方法

-record(bigdata, {mykey,some1,some2}). 

が5000の以上の行をフェッチ

mnesia:match_object({bigdata, mykey, some1,'_'}) 

最速の方法をやっているの?

明確化: 「カスタム」キーを作成することはオプションです(読み込みができるようになります)が、1つのキーでmatch_objectよりも5000回の読み込み速度が速いですか?

答えて

2

私はあなたが持っている場合は、その情報なしで、これは、関連する答えが...

ではないかもしれない、など、テーブルにあるどのように多くの行を、あなたは解決している問題のように好奇心が強いですそれでは、キーでread/2を使い、返されるレコードのリストをトラバースするほうが良いでしょう。可能であれば、選択と一致を避けるためにデータを構造化することが最善の方法です。

一般に、/ 2を選択するとmatch_objectよりも優先されます。これは、完全なテーブルスキャンをよりうまく回避する傾向があるからです。また、トランザクションサポートを必要としないと仮定すると、dirty_selectは速くなり、/ 2を選択します。そして、あなたが制約を受けて暮らすことができれば、Mensaは非常に速い基本的なetsテーブルに直接向かうことができますが、非常に険しい状況でしか適切でないので、ドキュメントを見てください。

1

さらに、Mnesiaはキーバリューストレージシステムであり、一致するレコードをすべてトラバースします。

高速にフェッチするには、クエリを直接サポートするようにストレージ構造を設計する必要があります。 some1をキーまたは索引にする。次に、readまたはindex_readでそれらを取得します。

0

Fastest Wayreturn more than 5000 rowsは、問題の問題によって異なります。データベース構造とは何ですか?私達は何が欲しいのか ?レコード構造は何ですか?その後、あなたの読書機能をどのように書いているかがわかります。主キーについて確信がある場合は、mnesia:read/1 or mnesia:read/2を使用してください。Query List comprehensionsを使用すると、その方が優れています。ネストしたレコードを検索したり、複雑な条件付きクエリを検索したりするのに柔軟性があります。下記の使用方法を参照してください。

 
-include_lib("stdlib/include/qlc.hrl"). 
-record(bigdata, {mykey,some1,some2}). 


%% query list comprehenshions 
select(Q)-> 
    %% to prevent against nested transactions 
    %% to ensure it also works whether table 
    %% is fragmented or not, we will use 
    %% mnesia:activity/4 

    case mnesia:is_transaction() of 
     false -> 
      F = fun(QH)-> qlc:e(QH) end, 
      mnesia:activity(transaction,F,[Q],mnesia_frag); 
     true -> qlc:e(Q) 
    end. 

%% to read by a given field or even several 
%% you use a list comprehension and pass the guards 
%% to filter those records accordingly 

read_by_field(some2,Value)-> 
    QueryHandle = qlc:q([X || X <- mnesia:table(bigdata), 
         X#bigdata.some2 == Value]), 
    select(QueryHandle). 

%% selecting by several conditions 

read_by_several()-> 
    %% you can pass as many guard expressions 

    QueryHandle = qlc:q([X || X <- mnesia:table(bigdata), 
          X#bigdata.some2 =< 300, 
          X#bigdata.some1 > 50 
          ]), 
    select(QueryHandle). 

%% Its possible to pass a 'fun' which will do the 
%% record selection in the query list comprehension 

auto_reader(ValidatorFun)-> 
    QueryHandle = qlc:q([X || X <- mnesia:table(bigdata), 
         ValidatorFun(X) == true]), 
    select(QueryHandle). 

read_using_auto()-> 
    F = fun({bigdata,SomeKey,_,Some2}) -> true; 
      (_) -> false 
     end, 
    auto_reader(F). 

私は最速の方法を望んでいれば、より明確化と問題の詳細が必要だと思います。速度は私の愛する多くの要因に依存します!

関連する問題