【tokyo cabinet】tctmgrでのindex作成

概要

テーブルデータベースについて、それぞれのカラムに型はないが、インデックスには数値型と文字列型の型がある
もし違ったものを張ったとしても、メインデータベースの全表スキャンでなくそれよりは小さいindexの全表スキャンとなるため、計算時間は短くなる
インデックスはデータベースを作った後で張ってもよいし、予めインデックスを張ってからレコードを追加してもよい
インデックスとレコード本体は自動的に同期がとられる
tctmgrにてindexを作成する方法以外にも、【ttserver “casket.tct#idx=name:lex”】など起動時にindexを生成することもできる

index作成方法

root@akat:/var/ttserver# tcttest write casket 10000000 # テストデータを10000000件作成
<Writing Test>
  seed=1484322170  path=casket  rnum=10000000  bnum=-1  apow=-1  fpow=-1  mt=0  opts=0  rcnum=0  lcnum=0  ncnum=0  xmsiz=-1  dfunit=0  iflags=0  omode=0  rnd=0

......................... (01000000)
......................... (02000000)
......................... (03000000)
......................... (04000000)
......................... (05000000)
......................... (06000000)
......................... (07000000)
......................... (08000000)
......................... (09000000)
......................... (10000000)
record number: 10000000
size: 788001040
sys_utime: 115.811237
sys_stime: 172.390773
sys_size: 85274624
sys_rss: 68235264
sys_total: 1051586560
sys_free: 64442368
sys_cached: 871489536
sys_corenum: 2
time: 567.029
ok

root@akat:/var/ttserver# tctmgr list -m 10 -pv casket # レコードとその値を10件表示
1       str     1       num     1       type    8       flag    3,7,11  text    3,7,11
2       str     2       num     1.11    type    4       flag    3,8     text    3,8
3       str     3       num     1       type    25      flag    4,7,10,12       text    4,7,10,12
4       str     4       num     3.95    type    14
5       str     5       num     0.37    type    2       flag    1       text    1
6       str     6       num     3       type    28
7       str     7       num     1       type    29      flag    3       text    3
8       str     8       num     1       type    22      flag    3,7,11,16       text    3,7,11,16
9       str     9       num     8.65    type    2       flag    2       text    2
10      str     10      num     9.00    type    8

root@akat:/var/ttserver# tctmgr search -m 10 -pv -ph casket str STRBW 98765 # strの98765で始まるレコードを検索する。-ph:ヒントを表示
98765   str     98765   num     98654.53        type    21      flag    5,10,11 text    5,10,11
987650  str     987650  num     332393.34       type    5       flag    1,3     text    1,3
987651  str     987651  num     704418  type    4
987652  str     987652  num     216249.03       type    16
987653  str     987653  num     914946.82       type    28
987654  str     987654  num     207197  type    4       flag    1,3     text    1,3
987655  str     987655  num     800664  type    27      flag    5,6     text    5,6
987656  str     987656  num     910914  type    1       flag    4,6,7   text    4,6,7
987657  str     987657  num     122482.63       type    21      flag    3,8     text    3,8
987658  str     987658  num     636826  type    11      flag    1,6,7   text    1,6,7
        :::: scanning the whole table # 全表スキャンが実施された
        :::: limited matching: 10
        :::: result set size: 10
        :::: leaving the natural order
        :::: number of records: 10
        :::: elapsed time: 1.34939

root@akat:/var/ttserver# tctmgr setindex -it lexical casket str # indexを壊すために途中でCtl+C
^C
root@akat:/var/ttserver# tctmgr search -m 10 -pv -ph casket str STRBW 98765 # indexが未完成の為、indexを利用した検索ができない
        :::: using an index: "str" asc (STRBW)
        :::: limited matching: 10
        :::: result set size: 0
        :::: leaving the natural order
        :::: number of records: 0
        :::: elapsed time: 0.00016

root@akat:/var/ttserver# tctmgr setindex -it lexical casket str # index作成コマンドにて同階層に【casket.idx.str.lex】が作成された。文字列型のindexとなる。
root@akat:/var/ttserver# tctmgr search -m 10 -pv -ph casket str STRBW 98765
98765   str     98765   num     98654.53        type    21      flag    5,10,11 text    5,10,11
987650  str     987650  num     332393.34       type    5       flag    1,3     text    1,3
9876500 str     9876500 num     1020880.50      type    3       flag    5,10,13 text    5,10,13
9876501 str     9876501 num     1149973.72      type    31
9876502 str     9876502 num     3086705 type    20      flag    1,5,6   text    1,5,6
9876503 str     9876503 num     1901912.78      type    4       flag    4,9,13  text    4,9,13
9876504 str     9876504 num     1378506.34      type    7       flag    1,3,7   text    1,3,7
9876505 str     9876505 num     8155588 type    21      flag    4,8,10,13       text    4,8,10,13
9876506 str     9876506 num     3575270 type    4       flag    2,5,7,10        text    2,5,7,10
9876507 str     9876507 num     560815  type    2       flag    1,6,11  text    1,6,11
        :::: using an index: "str" asc (STRBW)  # indexを利用した旨が記載されている
        :::: limited matching: 10
        :::: result set size: 10
        :::: leaving the natural order
        :::: number of records: 10
        :::: elapsed time: 0.00156 # 先ほどと比較して860倍ほど速度があがった
root@akat:/var/ttserver# tctmgr setindex -it decimal casket num # index作成コマンドにて同階層に【casket.idx.num.dec】が作成された。数値型のindexとなる。
root@akat:/var/ttserver#  tctmgr search -m 10 -pv -ph casket num NUMEQ 2112 # 2112と一致する数値を表示
99707   str     99707   num     2112    type    22      flag    5,7     text    5,7
6662    str     6662    num     2112    type    9       flag    5,8     text    5,8
        :::: using an index: "num" asc (NUMEQ) # indexを利用した旨が記載されている
        :::: limited matching: 10
        :::: result set size: 2
        :::: leaving the natural order
        :::: number of records: 2
        :::: elapsed time: 0.00018

root@akat:/var/ttserver# tctmgr setindex -it token casket flag # index作成コマンドにて同階層に【casket.idx.flag.tok】が作成された。タグ検索(STRAND演算子とSTROR演算子が高速化)を高速化する。
8       str     8       num     1       type    22      flag    3,7,11,16       text    3,7,11,16
32      str     32      num     22      type    22      flag    5,7,12,16       text    5,7,12,16
……………中略……………
9999814 str     9999814 num     5135957 type    9       flag    3,8,12,16       text    3,8,12,16
9999961 str     9999961 num     952144.89       type    6       flag    3,6,11,16       text    3,6,11,16
9999998 str     9999998 num     7212667 type    20      flag    5,7,11,16       text    5,7,11,16
        :::: using an index: "flag" inverted (STROR) # indexなしでは、57.58712秒かかった
        :::: token occurrence: "16" 112027
        :::: result set size: 112027
        :::: leaving the natural order
        :::: number of records: 112027
        :::: elapsed time: 0.16361

root@akat:/var/ttserver# tctmgr setindex -it qgram casket text # index作成コマンドにて同階層に【casket.idx.text.qgr】が作成された。全文検索を高速化するらしい。。

その他メモ

■演算子■
STREQ : 右辺の文字列が完全一致する
STRINC : 右辺の文字列を含む
STRBW : 右辺の文字列で始まる
STREW : 右辺の文字列で終わる
STRAND : 右辺の文字列内のカンマ区切りの文字列の全てを含む
STROR : 右辺の文字列内のカンマ区切りの文字列のいずれかを含む
STROREQ : 右辺の文字列内のカンマ区切りの文字列のいずれかと完全一致する
STRRX : 右辺の文字列の正規表現と一致する
NUMEQ : 右辺の数値と一致する
NUMGT : 右辺の数値より大きい
NUMGE : 右辺の数値と同じかより大きい
NUMLT : 右辺の数値より小さい
NUMLE : 右辺の数値と同じかより小さい
NUMBT : 右辺のカンマ区切りの2つの数値の間である
NUMOREQ : 右辺のカンマ区切りの文字列のいずれかと一致する

■index効果■
文字列型インデックス:
計算量が小さくなる演算子:STREQ、STRBW、STROREQ
計算量は同じだが高速化する演算子:STRINC、STREW、STRAND、STROR、STRRX、NUMEQ、NUMGT、NUMGE、NUMLT、NUMLE、NUMBT、NUMOREQ
計算量が小さくなる順序指定:STRASC、STRDESC
数値型インデックス:
計算量が小さくなる演算子:NUMEQ、NUMGT、NUMGE、NUMLT、NUMLE、NUMBT、NUMOREQ
計算量は同じだが高速化する演算子:STREQ、STRBW、STROREQ、STRINC、STREW、STRAND、STROR、STRRX
計算量が小さくなる順序指定:NUMASC、NUMDESC