MySQL FULLTEXTが遅い?
MySQLの横に置くインメモリ検索エンジン。重いFULLTEXT検索をMygramDBへ逃がします。
MySQLでGTIDモードとレプリケーションユーザーを設定:
用語補足
GTID はMySQLの変更に付く一意な番号、binlog はMySQLの変更履歴ログです。MygramDBはbinlogを読み、GTIDで「どこまで読んだか」を管理します。詳しくは用語集を参照してください。
SET GLOBAL enforce_gtid_consistency = ON;
SET GLOBAL gtid_mode = OFF_PERMISSIVE;
SET GLOBAL gtid_mode = ON_PERMISSIVE;
SET GLOBAL gtid_mode = ON;
SET GLOBAL binlog_format = ROW;
SET GLOBAL binlog_row_image = FULL;
CREATE USER 'repl_user'@'%' IDENTIFIED BY 'your_password';
-- SELECT: 全文検索対象テーブルの初期スナップショット取得用
GRANT REPLICATION SLAVE, REPLICATION CLIENT, SELECT ON mydb.* TO 'repl_user'@'%';MySQL設定は永続化してください
SET GLOBAL は稼働中のMySQLに反映されますが、再起動後に戻る場合があります。本番では my.cnf などの永続設定にも gtid_mode=ON、binlog_format=ROW、binlog_row_image=FULL を入れてください。
docker run -d --name mygramdb \
-p 11016:11016 -p 8080:8080 \
-e MYSQL_HOST=your-mysql-host \
-e MYSQL_USER=repl_user \
-e MYSQL_PASSWORD=your_password \
-e MYSQL_DATABASE=mydb \
-e TABLE_NAME=articles \
-e TABLE_PRIMARY_KEY=id \
-e TABLE_TEXT_COLUMN=content \
-e TABLE_NGRAM_SIZE=2 \
-e REPLICATION_SERVER_ID=12345 \
-e NETWORK_ALLOW_CIDRS=0.0.0.0/0 \
ghcr.io/libraz/mygram-db:latestWARNING
NETWORK_ALLOW_CIDRS=0.0.0.0/0 はすべてのIPからの接続を許可します。本番環境では特定の範囲に制限してください(例: 10.0.0.0/8,172.16.0.0/12)。
初回ロードについて
MygramDBは起動しただけでは既存データを自動では読み込みません。最初に SYNC articles を実行して、MySQLの既存行から検索インデックスを作成します。
docker exec mygramdb mygram-cli -p 11016 SYNC articles
docker exec mygramdb mygram-cli -p 11016 SYNC STATUS
echo "SEARCH articles hello world" | nc localhost 11016詳しい使い方は 公式クライアント を参照してください。
npm install mygramdb-clientyarn add mygramdb-clientbun add mygramdb-clientimport { createMygramClient } from 'mygramdb-client'
const client = createMygramClient({ host: 'localhost', port: 11016 })
await client.connect()
const results = await client.search('app_db.articles', 'hello world', {
limit: 10
})go get github.com/libraz/go-mygram-clientimport mygram "github.com/libraz/go-mygram-client"
client := mygram.NewClient("localhost:11016")
defer client.Close()
client.Connect()
resp, _ := client.Search("app_db.articles", "hello world", mygram.SearchOptions{
Limit: 10,
})pip install mygramdb-clientfrom mygramdb_client import MygramClient, ClientConfig, SearchOptions
async with MygramClient(ClientConfig(host='localhost', port=11016)) as client:
results = await client.search(
'app_db.articles',
'hello world',
SearchOptions(limit=10),
)python-mygramdb-client on GitHub