DBのレコード件数1800~2000万件程度のテーブルで全文検索した場合に、mroongaを使って検索した時にやたら時間がかかった。大体3秒~10秒ほどselect count(*)を実行するのにかかっていて、レコード件数多いから仕方ないのかな?と思っていたらsennaで運用していたDBの方は1秒もかからずに結果が返ってくる。
マシンのスペックでいうと
mroongaDB CPU:XEON-3430 Storage:NVME SSD READ 3.5GB/s
sennaDB CPU:XEON-3430 Storage:SATA SSD READ 450MB/s
といった具合でmroongaで運用しているマシンの方が読み書き性能は圧倒的に上。DBの検索スピードに影響するのはCPUよりもストレージの読み込み速度だと思うのでこの結果はちょっと悩ましい。
explainで調べてみたところ、
explain select count(*) from table where match(column) against(‘D+ 1s103 ‘ IN BOOLEAN MODE);
+—-+————-+——-+——+—————+——+———+——+——+——————————+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+—-+————-+——-+——+—————+——+———+——+——+——————————+
| 1 | SIMPLE | NULL | NULL | NULL | NULL | NULL | NULL | NULL | Select tables optimized away |
+—-+————-+——-+——+—————+——+———+——+——+——————————+
1 row in set (2.32 sec)
これがmroongaDBで検索した結果。次にsennaDBで検索すると
explain select count(*) from table_name where match(column) against(‘D+1s103′ IN BOOLEAN MODE);
+—-+————-+——————-+———-+—————+———-+———+——+——+————-+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+—-+————-+——————-+———-+—————+———-+———+——+——+————-+
| 1 | SIMPLE | table_name | fulltext | column | column | 0 | | 1 | Using where |
+—-+————-+——————-+———-+—————+———-+———+——+——+————-+
1 row in set (0.00 sec)
という違いがある。mroongaの方は「
Select tables optimized away 」とあるので一応インデックスは働いているようだが、検索の遅さには納得できない。検索に使ったキーワードは
「1s103 」という特に変わっているワードでもないがやたら時間がかかった。他の「alaedad」とか「akaweea」とかは結果がないならないで高速に検索を終えるのに「adk323」とか「132334323」みたいな数字が多い検索だとやたら時間がかかる。mroongaは数字の検索が苦手とかそういうことがあるんだろうか。sennaだと別にそういうようなことはなく割と速く0.1秒以内に結果を返してくれる。
sennaは検索をしている間はテーブルロックがかかってしまうという弱点があり、mroongaはそれがないらしい。あとsennaは割とメモリを喰うんでテーブルロックの件もあってmysqlデーモンが落ちることが結構あるがmroongaは私の経験上では不思議とメモリ不足で落ちたことがほとんどない。検索の速度でいうと後継だからmroongaが速いのだろうと勝手に思っていたが大差ないのかもしれない。私の参照オンリーな使い方だとむしろsennaの方が速い。デーモン落ちるのは怖いがcronで見張って自動復帰設定とかやりようはあるので今更ながらsennaに戻そうかと思案中。