Skip to content

ベンチマーク

110万件のWikipedia記事(英語100万件 + 日本語10万件、平均666文字)で MySQL 8.4 FULLTEXT(ngram パーサー)と比較。MygramDB v1.5.0、verify_text: all、クエリキャッシュ無効。すべての数値は10回計測のp50です。

数値の読み方

このページの数値は特定のデータセット、ハードウェア、設定での測定結果です。MygramDB v1.7.0でも基本的な検索エンジンの考え方は同じですが、実運用のレイテンシはデータ量、verify_text、フィルタ、ソート、同時接続数で変わります。

用語補足

p50 は計測値を速い順に並べたときの中央値です。半分のリクエストがこの値以下で終わる、という意味です。実運用ではp95やp99も重要ですが、このページではエンジン間の傾向を比較しやすいようp50を中心に示しています。

再現可能

リポジトリmake bench-up && make bench-run を実行すると同じベンチマークを実行できます。

ハードウェアについて

Apple M4 Max(128GB ユニファイドメモリ)で計測。ユニファイドメモリは一般的なサーバー用 DDR4/DDR5 より帯域が広いため、サーバー環境では両エンジンとも絶対値で遅くなりますが、相対的な性能差は同程度です。

検索レイテンシ(SORT id LIMIT 100)

検索レイテンシ(p50、対数スケール)

クエリタイプマッチ数MySQLMygramDB高速化
複合語 ("quantum physics")1042,566ms0.09ms27,600倍
中頻度 ("quantum")1,9611,874ms0.28ms6,700倍
低頻度 ("algorithm")2,498507ms0.42ms1,200倍
希少語 ("fibonacci")84936ms0.08ms11,600倍

CJK検索レイテンシ(SORT id LIMIT 100)

CJK検索レイテンシ(p50、対数スケール)

クエリマッチ数MySQLMygramDB高速化
日本32,2821,204ms1.1ms1,100倍
東京6,989300ms3.9ms77倍
科学1,5514.2ms2.2ms1.9倍

COUNT性能

COUNTレイテンシ(p50、対数スケール)

クエリタイプカウントMySQLMygramDB高速化
中頻度 ("quantum")1,9611,797ms0.08ms21,600倍
低頻度 ("algorithm")2,498416ms0.08ms5,500倍

結果一致性(v1.5.0)

このベンチマーク条件では、verify_text: all を有効にすると、MygramDB は MySQL FULLTEXT と同じ件数を返しました:

クエリMySQLMygramDB一致
quantum1,9611,961一致
algorithm2,4982,498一致
日本32,28232,282一致
科学1,5511,551一致

verify_text なしの場合、n-gram インデックスは偽陽性を含む場合があります(例: "quantum" で 1,961件ではなく 58,214件がヒット)。これは n-gram トークン化の特性であり、想定される動作です。

精度とメモリのトレードオフ

verify_text: all は正規化済みテキストを保持して最終確認するため、結果の正確性は上がりますがメモリ使用量も増えます。候補抽出だけで十分な用途では off、MySQL FULLTEXTと同等の一致性が必要な用途では all を検討してください。

並列スループット

スループット — QPS(高いほど良い)

クエリ: "algorithm"、レベルあたり10秒。

接続数MySQL QPSMygramDB QPSMySQL p50MygramDB p50
122,634470ms0.35ms
4811,766495ms0.32ms

メモリ使用量

ドキュメント数インデックスドキュメント+テキストRSS合計100万件あたり
1,100,000813MB1.54GB2.53GB約2.3GB

verify_text モード

  • off(デフォルト): メモリ使用量が少ないが、n-gram 偽陽性を含む場合あり
  • all: ドキュメントテキストを保持してポストフィルタ検証。110万件で約1.5GB 追加だが結果は正確

なぜこの性能が出るのか

アーキテクチャの違いについてはMySQL FULLTEXTが遅い理由を、Elasticsearchとの比較は比較ページをご覧ください。