概要
テーブルデータベースについて、それぞれのカラムに型はないが、インデックスには数値型と文字列型の型がある
もし違ったものを張ったとしても、メインデータベースの全表スキャンでなくそれよりは小さい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