よくある質問
MySQL FULLTEXTの問題
MySQL FULLTEXTが遅いのはなぜですか?
MySQL FULLTEXTが遅くなる原因:
- ディスクI/O: インデックスがディスク上にあり、毎回B-treeページを読み込む
- 非圧縮の転置リスト: 頻出語は数百万行にマッチし、大量のデータ読み込みが発生
- キャッシュ依存: コールド/ウォームキャッシュで2〜3倍の性能差
- 同時実行の問題: 10並列で90%のクエリが失敗
解決策: MygramDBは全データをメモリに保持し、常に80ms以下のレスポンスを実現。
MySQL FULLTEXTが負荷時にタイムアウトします。どう対処すべきですか?
MySQL FULLTEXTは同時クエリを処理できません。10並列の時点で:
- 90%のクエリが失敗
- QPSが0.4まで低下
- 平均レスポンス時間が4秒超
解決策: MygramDBを検索レプリカとして追加。100並列でも成功率100%、QPS 372を達成。
アプリケーションを変更せずにMySQL FULLTEXTを高速化できますか?
はい。MygramDBはbinlogレプリケーションでMySQLと同期します。アプリケーションは通常通りMySQLに書き込み、検索クエリだけをMygramDBにルーティングします。
bash
docker run -d -p 11016:11016 \
-e MYSQL_HOST=your-mysql \
ghcr.io/libraz/mygram-db:latestMygramDBと他の選択肢
Elasticsearchの代わりにMygramDBを使うべきですか?
MygramDBを選ぶ場合:
- データが単一ノードのRAMに収まる
- シンプルなデプロイ(単一バイナリ)が良い
- ETLなしでMySQLと直接同期したい
- 常に80ms以下のレイテンシが必要
Elasticsearchを選ぶ場合:
- 複数ノードでの分散検索が必要
- 高度な機能(ファジー検索、ハイライト、集計)が必要
- ペタバイト規模のデータ
MygramDBに必要なメモリ量は?
100万ドキュメントあたり約1〜2GB。1000万ドキュメントなら10〜20GBを想定してください。
MygramDBは日本語に対応していますか?
はい。ICUベースのUnicode正規化とN-gramトークナイズを使用。日本語・中国語・韓国語は追加プラグインなしでそのまま動作します。
はじめに
MySQL FULLTEXTからMygramDBへの移行方法は?
- MySQLをプライマリデータベースとして維持
- MygramDBを並行デプロイ(Docker or バイナリ)
- MySQLからのレプリケーションを設定
- 検索クエリをMygramDBにルーティング
- 書き込みは引き続きMySQLへ
データ移行は不要。MygramDBはbinlogで自動同期します。
MygramDBはどうやってMySQLと同期しますか?
GTIDベースのbinlogレプリケーションを使用します。MySQLレプリカと同じ仕組みです。MySQLでINSERT、UPDATE、DELETEすると、ミリ秒単位でMygramDBに反映されます。
その他の質問はGitHubをご確認いただくか、Issueを作成してください。