Skip to content

MygramDB vs Elasticsearch vs MySQL FULLTEXT

全文検索ソリューションは要件に応じて選ぶ必要があります。それぞれの特徴を比較します。

早見表

項目MygramDBElasticsearchMySQL FULLTEXT
レイテンシ1ms以下50〜500ms100〜3000ms
導入バイナリ1つクラスタ構築標準搭載
データ同期MySQL / MariaDB binlogで自動ETLが必要不要
スケール単一ノード分散可能単一ノード
メモリ100万件で約2.3GB(verify_text有効時)100万件で2〜4GBバッファプール次第
並列性能QPS 11,766高いQPS 2-8
日本語対応N-gram標準プラグイン追加N-gramパーサー
分析機能基本のみ充実なし
学習コスト低い高い低い

それぞれの特徴

MygramDB

向いているケース: MySQLを使っていて、手軽に検索を高速化したい

良い点:

  • 常にサブミリ秒の安定したレスポンス
  • binlogで勝手に同期、設定不要(MySQL 8.4/9.xおよびMariaDB 10.6+/11.x対応)
  • バイナリ1つ置くだけで動く
  • クラスタ管理なし
  • 日本語のN-gram検索が得意
  • BM25関連度スコア・ハイライト・ファジー検索・ファセット集計・シノニム展開に対応(v1.6.0以降)

注意点:

  • 分散検索はできない
  • データがメモリに収まる必要あり

Elasticsearch

向いているケース: 大規模データで高度な検索・分析が必要

良い点:

  • 水平スケールで容量追加可能
  • ファジー検索・ハイライト・集計など機能豊富
  • エコシステムが充実
  • ペタバイト級も対応

注意点:

  • クラスタの構築・運用が大変
  • データ連携にETLパイプラインが必要
  • 運用コストが高い
  • 学習に時間がかかる
  • JVMのチューニングが必要

MySQL FULLTEXT

向いているケース: 小規模データ(10万件以下)でシンプルに済ませたい

良い点:

  • MySQLに標準搭載
  • 追加のシステム不要
  • データ同期の手間なし

注意点:

  • 遅い(100〜3000ms)
  • 並列アクセスに弱い(2-8 QPS)
  • キャッシュ状態で性能が大きく変動
  • スケールしない

性能比較

詳しい数値はベンチマークをご覧ください。要点:110万件のWikipedia記事で、MygramDBはサブミリ秒のレイテンシで2,634-11,766 QPSを達成。MySQL FULLTEXTは300-2,566msのレイテンシで2-8 QPS。

移行方法

MySQL FULLTEXTからMygramDBへ

  1. MySQLはそのまま使い続ける
  2. MygramDBを横に立てる
  3. 検索だけMygramDBに向ける
  4. 書き込みはMySQLのまま
bash
# 1. MygramDBを起動
docker run -d -p 11016:11016 \
  -e MYSQL_HOST=your-mysql \
  ghcr.io/libraz/mygram-db:latest

# 2. MygramDBで検索
curl -X POST http://localhost:8080/articles/search \
  -H "Content-Type: application/json" \
  -d '{"q": "検索ワード"}'

ElasticsearchからMygramDBへ

こんな場合は乗り換えを検討:

  • 分散検索が実は不要だった
  • データが1台のメモリに収まる
  • 運用が大変すぎる
  • MySQLとの連携をシンプルにしたい

詳しくはGitHubをご覧ください。