Mnesia の disc_copies と index のサンプル

Mnesia の基礎パート2ということで、Mnesia の disc_copies と index を使ってみました。

index は普通の index です。指定した atom (カラム) に対して index を張る事が出来ます。
mnesia:add_table_index(キー, カラム) と設定すれば index が生成されます。
注意点としては index はほっといても消えませんので、del_table_index を使って削除してください。

もう一つの disc_copies ですが、Mnesia は通常はオンメモリで動作します。オンメモリは高速ですが当たり前ですが永続性が有りません。ということで読み込みはオンメモリ、書き込みはディスクへ。書き込みが非同期なのかどうかはまだ未調査です。

データのディスクの場所は -mnesia dir '"/tmp/mnesia"' で指定しています。今回は table 作成時に disc_copies を指定しています。 application:stop(mnesia) で一度 mnesia を停止して、次に application:start(mnesia) で起動したら登録されているデータベースを使用します。

dirty_read / dirty_index_read を使用しておりますが、基本は transaction を使いましょう。

Eshell V5.6.5  (abort with ^G)
1> 
$ erl -mnesia dir '"/tmp/mnesia"'
Erlang (BEAM) emulator version 5.6.5 [source] [smp:4] [async-threads:0] [hipe] [kernel-poll:false]

Eshell V5.6.5  (abort with ^G)
1> rd(store, {key, value1=0, value2=0, value3=0}).
store
2> mnesia:create_schema([node()]).
ok
3> application:start(mnesia).
ok
4> mnesia:create_table(store, [{disc_copies, [node()]}, {attributes, record_info(fields, store)}]).
{atomic,ok}
5> mnesia:add_table_index(store, value3).
{atomic,ok}
6> mnesia:transaction(fun() -> mnesia:write(#store{key=a, value1=10, value2=20, value3=30}) end).
{atomic,ok}
7> mnesia:transaction(fun() -> mnesia:write(#store{key=b, value1=20, value2=10, value3=30}) end).
{atomic,ok}
8> mnesia:transaction(fun() -> mnesia:write(#store{key=c, value1=40, value2=30, value3=20}) end).
{atomic,ok}
9> mnesia:dirty_read(store, a).
[#store{key = a,value1 = 10,value2 = 20,value3 = 30}]
10> mnesia:dirty_read(store, c).
[#store{key = c,value1 = 40,value2 = 30,value3 = 20}]
11> mnesia:dirty_index_read(store, 30, #store.value3).
[#store{key = b,value1 = 20,value2 = 10,value3 = 30},
 #store{key = a,value1 = 10,value2 = 20,value3 = 30}]
12> mnesia:dirty_index_read(store, 20, #store.value3).
[#store{key = c,value1 = 40,value2 = 30,value3 = 20}]
13> application:stop(mnesia).

=INFO REPORT==== 21-Feb-2009::22:28:37 ===
    application: mnesia
    exited: stopped
    type: temporary
ok
14> application:start(mnesia).
ok
15> mnesia:dirty_read(store, a).
[#store{key = a,value1 = 10,value2 = 20,value3 = 30}]
16> mnesia:dirty_read(store, c).
[#store{key = c,value1 = 40,value2 = 30,value3 = 20}]
17> mnesia:dirty_index_read(store, 30, #store.value3).
[#store{key = b,value1 = 20,value2 = 10,value3 = 30},
 #store{key = a,value1 = 10,value2 = 20,value3 = 30}]
18> mnesia:dirty_index_read(store, 20, #store.value3).
[#store{key = c,value1 = 40,value2 = 30,value3 = 20}]