まとまりのないブログ

something which something is something

mysql

mroongaよりsennaの方が検索速度が速い場合がある

投稿日:

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に戻そうかと思案中。

-mysql

執筆者:


comment

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)

関連記事

no image

ssdでデータベースサーバを構築してみた

現状ではまだ手を出すのは早いかもしれないssdでデータベースサーバを構築してみた。実験的な意味で。

no image

全文検索エンジンmroongaを使ってみた

sennaをビルドして使っていたのだけれど、レコード件数と速度に限界を感じてきていたのでその後継といわれるmroonga3.04を使ってみた。使ってみた感想は、mroongaストレージエンジンでの全文 …

no image

mysql インデックス バックアップ

mysqlのインデックスの作成やテーブルのバックアップ方法についてのメモ。

no image

mysqlのデータベースのテーブルから不要なフィールド(列)を削除

テーブルを再設計するために不要なフィールドを削除してみる。たしか前にフィールドを削除したときは、フィールドにインデックスが作成されている場合はフィールド削除の前にインデックスを削除しておかないとエラー …

no image

Wrong bytesec: 49-48-48 at linkstart: 14313808772

またテーブルのクラッシュ。mysqlのテーブルがクラッシュする頻度が激増してきた。以前はこんなことなかったのだが・・・。今は一日一回発生して絶えず見張っていなければならないという状態になってしまってい …