SlideShare a Scribd company logo
Mroonga と PGroonga - Groongaを使って MySQLとPostgreSQLで日本語全文検索 Powered by Rabbit 2.1.9
Mroongaと
PGroongaGroongaを使って
MySQLとPostgreSQLで日本語全文検索
須藤功平 クリアコード
MySQLとPostgreSQLと日本語全文検索
2016-02-09
Mroonga と PGroonga - Groongaを使って MySQLとPostgreSQLで日本語全文検索 Powered by Rabbit 2.1.9
Mroonga・PGroonga
Mroonga(むるんが)
MySQLに
高速日本語全文検索機能を追加する
プロダクト
PGroonga(ぴーじーるんが)
PostgreSQLに
高速日本語全文検索機能を追加する
プロダクト
Mroonga と PGroonga - Groongaを使って MySQLとPostgreSQLで日本語全文検索 Powered by Rabbit 2.1.9
すごい!使いたい!
インストールして!
え。。。組み込みじゃないの。。。
(MariaDBにはMroongaは組み込まれています!)
パッケージあるから簡単だよ!
クラウドサービスで使えない。。。
(クラウドサービスに入っていれば…!)
HerokuのPostgreSQLにPGroonga入れて!とお願いだ!
Mroonga と PGroonga - Groongaを使って MySQLとPostgreSQLで日本語全文検索 Powered by Rabbit 2.1.9
使いたい!?
HerokuのPostgreSQLで
PGroongaを使えるなら
Herokuを使いたい!
#herokujp
↑と思うならtweet!
(Herokuの人が観測します。)
Mroonga と PGroonga - Groongaを使って MySQLとPostgreSQLで日本語全文検索 Powered by Rabbit 2.1.9
高速?
ベンチマーク!
対象:Wikipedia日本語版
レコード数:約185万件
データサイズ:約7GB
メモリー4GB・SSD250GB(ConoHa)
https://github.com/groonga/wikipedia-search/issues/4
(他人のベンチマークは参考程度)
(検討時はちゃんと実際の環境でベンチマークをとろう!)
Mroonga と PGroonga - Groongaを使って MySQLとPostgreSQLで日本語全文検索 Powered by Rabbit 2.1.9
速さ:検索1
キーワード:テレビアニメ
(ヒット数:約2万3千件)
InnoDB ngram 3m2s
InnoDB MeCab 6m20s
Mroonga:1 0.11s
pg_bigm 4s
PGroonga:2 0.29s
Mroonga と PGroonga - Groongaを使って MySQLとPostgreSQLで日本語全文検索 Powered by Rabbit 2.1.9
速さ:検索2
キーワード:データベース
(ヒット数:約1万7千件)
InnoDB ngram 36s
InnoDB MeCab:1 0.03s
Mroonga:2 0.09s
pg_bigm 2s
PGroonga:3 0.17s
Mroonga と PGroonga - Groongaを使って MySQLとPostgreSQLで日本語全文検索 Powered by Rabbit 2.1.9
速さ:検索3
キーワード:PostgreSQL OR MySQL
(ヒット数:約400件)
InnoDB ngram N/A(エラー)
InnoDB MeCab:1 0.005s
Mroonga:2 0.028s
pg_bigm 0.185s
PGroonga:3 0.063s
Mroonga と PGroonga - Groongaを使って MySQLとPostgreSQLで日本語全文検索 Powered by Rabbit 2.1.9
速さ:検索4
キーワード:日本
(ヒット数:約63万件)
InnoDB ngram 1.3s
InnoDB MeCab 1.3s
Mroonga:1 0.21s
pg_bigm:2 0.84s
PGroonga 1s
Mroonga と PGroonga - Groongaを使って MySQLとPostgreSQLで日本語全文検索 Powered by Rabbit 2.1.9
速さ:検索まとめ
Mroonga・PGroonga
安定して速い
InnoDB FTS MeCab・pg_bigm
ハマれば速い
InnoDB FTS ngram
安定して遅い
Mroonga と PGroonga - Groongaを使って MySQLとPostgreSQLで日本語全文検索 Powered by Rabbit 2.1.9
使いたい!?
HerokuのPostgreSQLで
PGroongaを使えるなら
Herokuを使いたい!
#herokujp
↑と思うならtweet!
(Herokuの人が観測します。)
Mroonga と PGroonga - Groongaを使って MySQLとPostgreSQLで日本語全文検索 Powered by Rabbit 2.1.9
速さ:データロード
約185万件・約7GB・SSD
InnoDB ngram 6m51s
InnoDB MeCab 6m22s
Mroonga:3 5m45s
pg_bigm:1 5m14s
PGroonga:2 5m22s
MySQLはbinlog有効、PostgreSQLはWAL有効
InnoDBはどっちも同じ処理
pg_bigmとPGroongaもどっちも同じ処理
Mroonga と PGroonga - Groongaを使って MySQLとPostgreSQLで日本語全文検索 Powered by Rabbit 2.1.9
速さ:インデックス作成
約185万件・約7GB・SSD
InnoDB ngram 3h06m58s
InnoDB MeCab 2h41m55s
Mroonga:1 22m24s
pg_bigm 3h43m23s
PGroonga:2 54m34s
MySQLはbinlog有効、PostgreSQLはWAL有効
バルクインデックス作成
=データ投入後インデックス作成
Mroonga と PGroonga - Groongaを使って MySQLとPostgreSQLで日本語全文検索 Powered by Rabbit 2.1.9
速さ:ロードまとめ
データロードは大差ない
インデックス作成は大差
Mroonga・PGroongaは分単位
InnoDB・pg_bigmは時間単位
Mroonga と PGroonga - Groongaを使って MySQLとPostgreSQLで日本語全文検索 Powered by Rabbit 2.1.9
使いたい!?
HerokuのPostgreSQLで
PGroongaを使えるなら
Herokuを使いたい!
#herokujp
↑と思うならtweet!
(Herokuの人が観測します。)
Mroonga と PGroonga - Groongaを使って MySQLとPostgreSQLで日本語全文検索 Powered by Rabbit 2.1.9
サイズ:データ
InnoDB ngram 10GB
InnoDB MeCab 10GB
Mroonga 8.2GB
pg_bigm:2 5.1GB
PGroonga:1 4.3GB
InnoDBはどっちも同じ
pg_bigmとPGroongaはどっちも同じはずだけど…
Mroonga と PGroonga - Groongaを使って MySQLとPostgreSQLで日本語全文検索 Powered by Rabbit 2.1.9
サイズ:インデックス
InnoDB ngram 12GB
InnoDB MeCab:1 6GB
Mroonga:1 6GB
pg_bigm:3 7GB
PGroonga 10GB
InnoDBは一時ファイル(何十GB単位)を作る
PGroongaは元データ(8GB)のコピーもLZ4圧縮して持っている
Mroonga と PGroonga - Groongaを使って MySQLとPostgreSQLで日本語全文検索 Powered by Rabbit 2.1.9
サイズ:まとめ
データサイズ
PostgreSQLは元データより小さめ
InnoDBは元データより大きめ
インデックスサイズ
InnoDB MeCabは小さめ
(ヒント:形態素解析ベースの方が小さくなる)
Mroonga・pg_bigmはN-gramなのに
InnoDB MeCabと同じくらい
Mroonga と PGroonga - Groongaを使って MySQLとPostgreSQLで日本語全文検索 Powered by Rabbit 2.1.9
高速?
ベンチマークで
確認
Mroonga と PGroonga - Groongaを使って MySQLとPostgreSQLで日本語全文検索 Powered by Rabbit 2.1.9
Mroonga・PGroonga
Mroonga(むるんが)
MySQLに
高速日本語全文検索機能を追加する
プロダクト
PGroonga(ぴーじーるんが)
PostgreSQLに
高速日本語全文検索機能を追加する
プロダクト
Mroonga と PGroonga - Groongaを使って MySQLとPostgreSQLで日本語全文検索 Powered by Rabbit 2.1.9
実現方法
Mroonga(むるんが)
MySQLに
Groonga(ぐるんが)を組み込み
PGroonga(ぴーじーるんが)
PostgreSQLに
Groonga(ぐるんが)を組み込み
Mroonga と PGroonga - Groongaを使って MySQLとPostgreSQLで日本語全文検索 Powered by Rabbit 2.1.9
Groonga
国産の高速全文検索エンジン
日本語バッチリ
ライブラリーとして使える
組み込みやすい
マルチスレッド対応
(MySQL組み込み時にうれしい)
マルチプロセス対応
(PostgreSQL組み込み時にうれしい)
Mroonga と PGroonga - Groongaを使って MySQLとPostgreSQLで日本語全文検索 Powered by Rabbit 2.1.9
組み込み方針
Groongaをできるだけ活かす
使い勝手はMySQL・PostgreSQL
に寄せる
↓
SQLで使えるGroonga
Mroonga と PGroonga - Groongaを使って MySQLとPostgreSQLで日本語全文検索 Powered by Rabbit 2.1.9
ポジション
MySQLらしさ
PostgreSQLらしさ
全文検索エンジンの性能
(速さ・精度・関連機能など)
InnoDB FTS
pg_bigm
Mroonga と PGroonga - Groongaを使って MySQLとPostgreSQLで日本語全文検索 Powered by Rabbit 2.1.9
SQLで使えるGroonga
Groongaのフル機能は諦める
速度など譲れない部分はがんばる
その分、使いやすさを重視
使いやすさ1=
MySQL・PostgreSQLとなじんでいる
使いやすさ2=
MySQL・PostgreSQLの不便を解消
Mroonga と PGroonga - Groongaを使って MySQLとPostgreSQLで日本語全文検索 Powered by Rabbit 2.1.9
なじみ度:Mroonga
インデックス作成:MySQLと同じ
CREATE TABLE ... (
...,
FULLTEXT INDEX (column)
) ENGINE=Mroonga;
Mroonga と PGroonga - Groongaを使って MySQLとPostgreSQLで日本語全文検索 Powered by Rabbit 2.1.9
なじみ度:Mroonga
全文検索:MySQLと同じ
SELECT * FROM ...
WHERE
MATCH(column)
AGAINST('キーワード'
IN BOOLEAN MODE);
Mroonga と PGroonga - Groongaを使って MySQLとPostgreSQLで日本語全文検索 Powered by Rabbit 2.1.9
不便解消:Mroonga
デフォルトOR→AND
-- ↓AまたはBが含まれていればマッチ
AGAINST('A B' IN BOOLEAN MODE);
AGAINST('+A +B' IN BOOLEAN MODE);
-- ↑↓AとBが含まれていればマッチ
-- ↓Mroongaの拡張
AGAINST('*D+ A B' IN BOOLEAN MODE);
Mroonga と PGroonga - Groongaを使って MySQLとPostgreSQLで日本語全文検索 Powered by Rabbit 2.1.9
不便解消:Mroonga
重み指定
-- titleかcontentにAがあればマッチ
-- (便利。PostgreSQLではできない。)
MATCH(title, content)
AGAINST('A' IN BOOLEAN MODE)
-- でもtitleの方を重要視したい!
-- ↓Mroongaの拡張
AGAINST('*W1:10,2:1 A' IN BOOLEAN MODE)
Mroonga と PGroonga - Groongaを使って MySQLとPostgreSQLで日本語全文検索 Powered by Rabbit 2.1.9
不便解消:Mroonga
全文検索+ORDER LIMIT高速化
SELECT * FROM tweets
WHERE
MATCH(content)
AGAINST('...' IN BOOLEAN MODE)
ORDER BY timestamp DESC
LIMIT 10;
Mroonga と PGroonga - Groongaを使って MySQLとPostgreSQLで日本語全文検索 Powered by Rabbit 2.1.9
ORDER LIMIT高速化
なぜ速いか
Groongaでソートし、LIMIT件だけ
MySQLに返しているから
MySQLよりGroongaでやった方が速い
(ヒント:カラムストア)
Mroonga と PGroonga - Groongaを使って MySQLとPostgreSQLで日本語全文検索 Powered by Rabbit 2.1.9
さらにORDER LIMIT高速化
SELECT * FROM tweets
WHERE
MATCH(content)
AGAINST('...' IN BOOLEAN MODE) AND
timestamp >= '2016-02-01'
-- ↑今月の分だけ対象にしたい
ORDER BY timestamp DESC
LIMIT 10;
Mroonga と PGroonga - Groongaを使って MySQLとPostgreSQLで日本語全文検索 Powered by Rabbit 2.1.9
さらにORDER LIMIT高速化
なぜ速いか
Groongaで絞り込んでソートし、
LIMIT件だけMySQLに返しているから
MySQLよりGroongaでやった方が速い
(ヒント:カラムストア)
場合によっては10倍以上高速化
http://tech.gmo-media.jp/post/69542751128/
mroonga-311-new-optimization
Mroonga と PGroonga - Groongaを使って MySQLとPostgreSQLで日本語全文検索 Powered by Rabbit 2.1.9
PGroonga
Groongaのフル機能は諦める
速度など譲れない部分はがんばる
その分、使いやすさを重視
使いやすさ1=
MySQL・PostgreSQLとなじんでいる
使いやすさ2=
MySQL・PostgreSQLの不便を解消
Mroonga と PGroonga - Groongaを使って MySQLとPostgreSQLで日本語全文検索 Powered by Rabbit 2.1.9
なじみ度:PGroonga
インデックス作成:
PostgreSQLと同じ
CREATE INDEX name ON texts
USING pgroonga (content);
Mroonga と PGroonga - Groongaを使って MySQLとPostgreSQLで日本語全文検索 Powered by Rabbit 2.1.9
なじみ度:PGroonga
全文検索:
PostgreSQLのtextsearchとほぼ同
じ
SELECT * FROM ...
WHERE
column @@ 'キーワード';
Mroonga と PGroonga - Groongaを使って MySQLとPostgreSQLで日本語全文検索 Powered by Rabbit 2.1.9
textsearchとの違い
構文
-- textsearch
-- プログラムのよう
'(A & B) | C'
-- PGroonga(不便解消)
-- Web検索エンジンのよう
'(A B) OR C'
Mroonga と PGroonga - Groongaを使って MySQLとPostgreSQLで日本語全文検索 Powered by Rabbit 2.1.9
不便解消:PGroonga
Windows用バイナリーあり
商用ログ管理製品
「VVAULT AUDIT」が採用
http://vvault.jp/product/vvault-audit/
アクセスログに対して
ユーザー名・パスを全文検索
決め手:高速・省スペース
Mroonga と PGroonga - Groongaを使って MySQLとPostgreSQLで日本語全文検索 Powered by Rabbit 2.1.9
不便解消:PGroonga
JSONデータを全文検索
CREATE TABLE logs (record jsonb);
CREATE INDEX i ON logs
USING pgroonga (record);
-- ログのどこかに「error」があればマッチ
SELECT * FROM logs
WHERE record @@ 'string @ "error"';
Mroonga と PGroonga - Groongaを使って MySQLとPostgreSQLで日本語全文検索 Powered by Rabbit 2.1.9
JSON全文検索例
以下は全部マッチ
{"message": "Error!"}
{"tags": ["web", "error"]}
{"syslog": {"message": "error!"}}
Mroonga と PGroonga - Groongaを使って MySQLとPostgreSQLで日本語全文検索 Powered by Rabbit 2.1.9
使いたい!?
HerokuのPostgreSQLで
PGroongaを使えるなら
Herokuを使いたい!
#herokujp
↑と思うならtweet!
(Herokuの人が観測します。)
Mroonga と PGroonga - Groongaを使って MySQLとPostgreSQLで日本語全文検索 Powered by Rabbit 2.1.9
まとめ1
Groonga(ぐるんが)
国産の高速全文検索エンジン
Mroonga(むるんが)
MySQLからGroongaを使える!
PGroonga(ぴーじーるんが)
PostgreSQLからGroongaを使える!
Mroonga と PGroonga - Groongaを使って MySQLとPostgreSQLで日本語全文検索 Powered by Rabbit 2.1.9
まとめ2
実装方針
Groongaをできるだけ活かす
(例:速度)
MySQL/PostgreSQLっぽく使える
MySQL/PostgreSQLをより便利に
Mroonga と PGroonga - Groongaを使って MySQLとPostgreSQLで日本語全文検索 Powered by Rabbit 2.1.9
次回予告
トランザクションは?
クラッシュしたら?
レプリケーションは?
もっと速くならないの?

More Related Content

PDF
初心者向けMroonga・PGroonga情報
PDF
PGroonga 2 - PostgreSQLでの全文検索の決定版
PPTX
pg_bigmで全文検索するときに気を付けたい5つのポイント(第23回PostgreSQLアンカンファレンス@オンライン 発表資料)
PDF
pg_bigmを触り始めた人に伝えたいこと
PPTX
VSCodeで作るPostgreSQL開発環境(第25回 PostgreSQLアンカンファレンス@オンライン 発表資料)
PDF
MySQLとPostgreSQLと日本語全文検索 - Azure DatabaseでMroonga・PGroongaを使いたいですよね!?
PDF
PG-REXで学ぶPacemaker運用の実例
PDF
Embulk - 進化するバルクデータローダ
初心者向けMroonga・PGroonga情報
PGroonga 2 - PostgreSQLでの全文検索の決定版
pg_bigmで全文検索するときに気を付けたい5つのポイント(第23回PostgreSQLアンカンファレンス@オンライン 発表資料)
pg_bigmを触り始めた人に伝えたいこと
VSCodeで作るPostgreSQL開発環境(第25回 PostgreSQLアンカンファレンス@オンライン 発表資料)
MySQLとPostgreSQLと日本語全文検索 - Azure DatabaseでMroonga・PGroongaを使いたいですよね!?
PG-REXで学ぶPacemaker運用の実例
Embulk - 進化するバルクデータローダ

What's hot (20)

PDF
PostgreSQLでスケールアウト
PDF
ChatGPTのデータソースにPostgreSQLを使う(第42回PostgreSQLアンカンファレンス@オンライン 発表資料)
PDF
pg_bigm(ピージーバイグラム)を用いた全文検索のしくみ
PDF
PostgreSQL 15 開発最新情報
PDF
Ethernetの受信処理
PDF
Pacemakerを使いこなそう
PPTX
CloudNativePGを動かしてみた! ~PostgreSQL on Kubernetes~(第34回PostgreSQLアンカンファレンス@オンライ...
PDF
爆速クエリエンジン”Presto”を使いたくなる話
PDF
1076: CUDAデバッグ・プロファイリング入門
PDF
[GKE & Spanner 勉強会] Cloud Spanner の技術概要
PDF
pg_trgmと全文検索
PDF
KubeCon 2021 NA Recap - Scheduler拡張事例最前線 / Kubernetes Meetup Tokyo #47 / #k8sjp
PDF
いまさら聞けないPostgreSQL運用管理
PDF
オンライン物理バックアップの排他モードと非排他モードについて(第15回PostgreSQLアンカンファレンス@オンライン 発表資料)
PDF
PostgreSQL13でのpg_basebackupの改善について(第13回PostgreSQLアンカンファレンス@オンライン)
PPTX
PostgreSQL 12は ここがスゴイ! ~性能改善やpluggable storage engineなどの新機能を徹底解説~ (NTTデータ テクノ...
PDF
PostgreSQLによるデータ分析ことはじめ
PDF
超実践 Cloud Spanner 設計講座
PDF
MySQL・PostgreSQLだけで作る高速あいまい全文検索システム
PDF
C++でNVMeと(*´Д`)ハァハァ 戯れていたら一年経ってた。
PostgreSQLでスケールアウト
ChatGPTのデータソースにPostgreSQLを使う(第42回PostgreSQLアンカンファレンス@オンライン 発表資料)
pg_bigm(ピージーバイグラム)を用いた全文検索のしくみ
PostgreSQL 15 開発最新情報
Ethernetの受信処理
Pacemakerを使いこなそう
CloudNativePGを動かしてみた! ~PostgreSQL on Kubernetes~(第34回PostgreSQLアンカンファレンス@オンライ...
爆速クエリエンジン”Presto”を使いたくなる話
1076: CUDAデバッグ・プロファイリング入門
[GKE & Spanner 勉強会] Cloud Spanner の技術概要
pg_trgmと全文検索
KubeCon 2021 NA Recap - Scheduler拡張事例最前線 / Kubernetes Meetup Tokyo #47 / #k8sjp
いまさら聞けないPostgreSQL運用管理
オンライン物理バックアップの排他モードと非排他モードについて(第15回PostgreSQLアンカンファレンス@オンライン 発表資料)
PostgreSQL13でのpg_basebackupの改善について(第13回PostgreSQLアンカンファレンス@オンライン)
PostgreSQL 12は ここがスゴイ! ~性能改善やpluggable storage engineなどの新機能を徹底解説~ (NTTデータ テクノ...
PostgreSQLによるデータ分析ことはじめ
超実践 Cloud Spanner 設計講座
MySQL・PostgreSQLだけで作る高速あいまい全文検索システム
C++でNVMeと(*´Д`)ハァハァ 戯れていたら一年経ってた。
Ad

Similar to MroongaとPGroonga (20)

PDF
PGroongaの実装
PDF
Groonga族2015
PDF
MySQL・PostgreSQL上で動かす全文検索エンジン「Groonga」セミナー
PDF
Mroonga・PGroonga導入方法
PDF
MySQL・PostgreSQLだけで作る高速でリッチな全文検索システム
PDF
Mroonga開発者が来たぞ!
PDF
Groonga Meetup 2014/04/29
PDF
PostgreSQLでpg_bigmを使って日本語全文検索 (MySQLとPostgreSQLの日本語全文検索勉強会 発表資料)
PDF
PHPでPostgreSQLとPGroongaを使って高速日本語全文検索!
PDF
Droongaのはじめかた
PDF
HerokuでGroonga
PDF
Mroonga 20131129
PDF
Groonga族2016
PDF
Mroonga Meetup 2014/06/29
PDF
GroongaでRedmineを高速全文検索
PDF
はじめてのDroonga
PDF
Droonga as-groonga-with-replication-droonga-as-groonga-with-replication
PDF
Droonga - 分散Groongaで快適レプリケーション生活
PDF
Groongaを支える取り組み
PDF
Groongaの今後への期待
PGroongaの実装
Groonga族2015
MySQL・PostgreSQL上で動かす全文検索エンジン「Groonga」セミナー
Mroonga・PGroonga導入方法
MySQL・PostgreSQLだけで作る高速でリッチな全文検索システム
Mroonga開発者が来たぞ!
Groonga Meetup 2014/04/29
PostgreSQLでpg_bigmを使って日本語全文検索 (MySQLとPostgreSQLの日本語全文検索勉強会 発表資料)
PHPでPostgreSQLとPGroongaを使って高速日本語全文検索!
Droongaのはじめかた
HerokuでGroonga
Mroonga 20131129
Groonga族2016
Mroonga Meetup 2014/06/29
GroongaでRedmineを高速全文検索
はじめてのDroonga
Droonga as-groonga-with-replication-droonga-as-groonga-with-replication
Droonga - 分散Groongaで快適レプリケーション生活
Groongaを支える取り組み
Groongaの今後への期待
Ad

More from Kouhei Sutou (20)

PDF
RubyKaigi 2022 - Fast data processing with Ruby and Apache Arrow
PDF
Apache Arrow Flight – ビッグデータ用高速データ転送フレームワーク #dbts2021
PDF
RubyKaigi Takeout 2021 - Red Arrow - Ruby and Apache Arrow
PDF
Rubyと仕事と自由なソフトウェア
PDF
Apache Arrowフォーマットはなぜ速いのか
PDF
Apache Arrow 1.0 - A cross-language development platform for in-memory data
PDF
Apache Arrow 2019
PDF
Redmine検索の未来像
PDF
Apache Arrow - A cross-language development platform for in-memory data
PDF
Better CSV processing with Ruby 2.6
PDF
Apache Arrow
PDF
Apache Arrow - データ処理ツールの次世代プラットフォーム
PDF
Apache Arrow
PDF
MySQL 8.0でMroonga
PDF
My way with Ruby
PDF
Red Data Tools
PDF
Mroongaの高速全文検索機能でWordPress内のコンテンツを有効活用!
PDF
MariaDBとMroongaで作る全言語対応超高速全文検索システム
PDF
PGroonga 2 – Make PostgreSQL rich full text search system backend!
PDF
PostgreSQLとPGroongaで作るPHPマニュアル高速全文検索システム
RubyKaigi 2022 - Fast data processing with Ruby and Apache Arrow
Apache Arrow Flight – ビッグデータ用高速データ転送フレームワーク #dbts2021
RubyKaigi Takeout 2021 - Red Arrow - Ruby and Apache Arrow
Rubyと仕事と自由なソフトウェア
Apache Arrowフォーマットはなぜ速いのか
Apache Arrow 1.0 - A cross-language development platform for in-memory data
Apache Arrow 2019
Redmine検索の未来像
Apache Arrow - A cross-language development platform for in-memory data
Better CSV processing with Ruby 2.6
Apache Arrow
Apache Arrow - データ処理ツールの次世代プラットフォーム
Apache Arrow
MySQL 8.0でMroonga
My way with Ruby
Red Data Tools
Mroongaの高速全文検索機能でWordPress内のコンテンツを有効活用!
MariaDBとMroongaで作る全言語対応超高速全文検索システム
PGroonga 2 – Make PostgreSQL rich full text search system backend!
PostgreSQLとPGroongaで作るPHPマニュアル高速全文検索システム

MroongaとPGroonga

  • 1. Mroonga と PGroonga - Groongaを使って MySQLとPostgreSQLで日本語全文検索 Powered by Rabbit 2.1.9 Mroongaと PGroongaGroongaを使って MySQLとPostgreSQLで日本語全文検索 須藤功平 クリアコード MySQLとPostgreSQLと日本語全文検索 2016-02-09
  • 2. Mroonga と PGroonga - Groongaを使って MySQLとPostgreSQLで日本語全文検索 Powered by Rabbit 2.1.9 Mroonga・PGroonga Mroonga(むるんが) MySQLに 高速日本語全文検索機能を追加する プロダクト PGroonga(ぴーじーるんが) PostgreSQLに 高速日本語全文検索機能を追加する プロダクト
  • 3. Mroonga と PGroonga - Groongaを使って MySQLとPostgreSQLで日本語全文検索 Powered by Rabbit 2.1.9 すごい!使いたい! インストールして! え。。。組み込みじゃないの。。。 (MariaDBにはMroongaは組み込まれています!) パッケージあるから簡単だよ! クラウドサービスで使えない。。。 (クラウドサービスに入っていれば…!) HerokuのPostgreSQLにPGroonga入れて!とお願いだ!
  • 4. Mroonga と PGroonga - Groongaを使って MySQLとPostgreSQLで日本語全文検索 Powered by Rabbit 2.1.9 使いたい!? HerokuのPostgreSQLで PGroongaを使えるなら Herokuを使いたい! #herokujp ↑と思うならtweet! (Herokuの人が観測します。)
  • 5. Mroonga と PGroonga - Groongaを使って MySQLとPostgreSQLで日本語全文検索 Powered by Rabbit 2.1.9 高速? ベンチマーク! 対象:Wikipedia日本語版 レコード数:約185万件 データサイズ:約7GB メモリー4GB・SSD250GB(ConoHa) https://github.com/groonga/wikipedia-search/issues/4 (他人のベンチマークは参考程度) (検討時はちゃんと実際の環境でベンチマークをとろう!)
  • 6. Mroonga と PGroonga - Groongaを使って MySQLとPostgreSQLで日本語全文検索 Powered by Rabbit 2.1.9 速さ:検索1 キーワード:テレビアニメ (ヒット数:約2万3千件) InnoDB ngram 3m2s InnoDB MeCab 6m20s Mroonga:1 0.11s pg_bigm 4s PGroonga:2 0.29s
  • 7. Mroonga と PGroonga - Groongaを使って MySQLとPostgreSQLで日本語全文検索 Powered by Rabbit 2.1.9 速さ:検索2 キーワード:データベース (ヒット数:約1万7千件) InnoDB ngram 36s InnoDB MeCab:1 0.03s Mroonga:2 0.09s pg_bigm 2s PGroonga:3 0.17s
  • 8. Mroonga と PGroonga - Groongaを使って MySQLとPostgreSQLで日本語全文検索 Powered by Rabbit 2.1.9 速さ:検索3 キーワード:PostgreSQL OR MySQL (ヒット数:約400件) InnoDB ngram N/A(エラー) InnoDB MeCab:1 0.005s Mroonga:2 0.028s pg_bigm 0.185s PGroonga:3 0.063s
  • 9. Mroonga と PGroonga - Groongaを使って MySQLとPostgreSQLで日本語全文検索 Powered by Rabbit 2.1.9 速さ:検索4 キーワード:日本 (ヒット数:約63万件) InnoDB ngram 1.3s InnoDB MeCab 1.3s Mroonga:1 0.21s pg_bigm:2 0.84s PGroonga 1s
  • 10. Mroonga と PGroonga - Groongaを使って MySQLとPostgreSQLで日本語全文検索 Powered by Rabbit 2.1.9 速さ:検索まとめ Mroonga・PGroonga 安定して速い InnoDB FTS MeCab・pg_bigm ハマれば速い InnoDB FTS ngram 安定して遅い
  • 11. Mroonga と PGroonga - Groongaを使って MySQLとPostgreSQLで日本語全文検索 Powered by Rabbit 2.1.9 使いたい!? HerokuのPostgreSQLで PGroongaを使えるなら Herokuを使いたい! #herokujp ↑と思うならtweet! (Herokuの人が観測します。)
  • 12. Mroonga と PGroonga - Groongaを使って MySQLとPostgreSQLで日本語全文検索 Powered by Rabbit 2.1.9 速さ:データロード 約185万件・約7GB・SSD InnoDB ngram 6m51s InnoDB MeCab 6m22s Mroonga:3 5m45s pg_bigm:1 5m14s PGroonga:2 5m22s MySQLはbinlog有効、PostgreSQLはWAL有効 InnoDBはどっちも同じ処理 pg_bigmとPGroongaもどっちも同じ処理
  • 13. Mroonga と PGroonga - Groongaを使って MySQLとPostgreSQLで日本語全文検索 Powered by Rabbit 2.1.9 速さ:インデックス作成 約185万件・約7GB・SSD InnoDB ngram 3h06m58s InnoDB MeCab 2h41m55s Mroonga:1 22m24s pg_bigm 3h43m23s PGroonga:2 54m34s MySQLはbinlog有効、PostgreSQLはWAL有効 バルクインデックス作成 =データ投入後インデックス作成
  • 14. Mroonga と PGroonga - Groongaを使って MySQLとPostgreSQLで日本語全文検索 Powered by Rabbit 2.1.9 速さ:ロードまとめ データロードは大差ない インデックス作成は大差 Mroonga・PGroongaは分単位 InnoDB・pg_bigmは時間単位
  • 15. Mroonga と PGroonga - Groongaを使って MySQLとPostgreSQLで日本語全文検索 Powered by Rabbit 2.1.9 使いたい!? HerokuのPostgreSQLで PGroongaを使えるなら Herokuを使いたい! #herokujp ↑と思うならtweet! (Herokuの人が観測します。)
  • 16. Mroonga と PGroonga - Groongaを使って MySQLとPostgreSQLで日本語全文検索 Powered by Rabbit 2.1.9 サイズ:データ InnoDB ngram 10GB InnoDB MeCab 10GB Mroonga 8.2GB pg_bigm:2 5.1GB PGroonga:1 4.3GB InnoDBはどっちも同じ pg_bigmとPGroongaはどっちも同じはずだけど…
  • 17. Mroonga と PGroonga - Groongaを使って MySQLとPostgreSQLで日本語全文検索 Powered by Rabbit 2.1.9 サイズ:インデックス InnoDB ngram 12GB InnoDB MeCab:1 6GB Mroonga:1 6GB pg_bigm:3 7GB PGroonga 10GB InnoDBは一時ファイル(何十GB単位)を作る PGroongaは元データ(8GB)のコピーもLZ4圧縮して持っている
  • 18. Mroonga と PGroonga - Groongaを使って MySQLとPostgreSQLで日本語全文検索 Powered by Rabbit 2.1.9 サイズ:まとめ データサイズ PostgreSQLは元データより小さめ InnoDBは元データより大きめ インデックスサイズ InnoDB MeCabは小さめ (ヒント:形態素解析ベースの方が小さくなる) Mroonga・pg_bigmはN-gramなのに InnoDB MeCabと同じくらい
  • 19. Mroonga と PGroonga - Groongaを使って MySQLとPostgreSQLで日本語全文検索 Powered by Rabbit 2.1.9 高速? ベンチマークで 確認
  • 20. Mroonga と PGroonga - Groongaを使って MySQLとPostgreSQLで日本語全文検索 Powered by Rabbit 2.1.9 Mroonga・PGroonga Mroonga(むるんが) MySQLに 高速日本語全文検索機能を追加する プロダクト PGroonga(ぴーじーるんが) PostgreSQLに 高速日本語全文検索機能を追加する プロダクト
  • 21. Mroonga と PGroonga - Groongaを使って MySQLとPostgreSQLで日本語全文検索 Powered by Rabbit 2.1.9 実現方法 Mroonga(むるんが) MySQLに Groonga(ぐるんが)を組み込み PGroonga(ぴーじーるんが) PostgreSQLに Groonga(ぐるんが)を組み込み
  • 22. Mroonga と PGroonga - Groongaを使って MySQLとPostgreSQLで日本語全文検索 Powered by Rabbit 2.1.9 Groonga 国産の高速全文検索エンジン 日本語バッチリ ライブラリーとして使える 組み込みやすい マルチスレッド対応 (MySQL組み込み時にうれしい) マルチプロセス対応 (PostgreSQL組み込み時にうれしい)
  • 23. Mroonga と PGroonga - Groongaを使って MySQLとPostgreSQLで日本語全文検索 Powered by Rabbit 2.1.9 組み込み方針 Groongaをできるだけ活かす 使い勝手はMySQL・PostgreSQL に寄せる ↓ SQLで使えるGroonga
  • 24. Mroonga と PGroonga - Groongaを使って MySQLとPostgreSQLで日本語全文検索 Powered by Rabbit 2.1.9 ポジション MySQLらしさ PostgreSQLらしさ 全文検索エンジンの性能 (速さ・精度・関連機能など) InnoDB FTS pg_bigm
  • 25. Mroonga と PGroonga - Groongaを使って MySQLとPostgreSQLで日本語全文検索 Powered by Rabbit 2.1.9 SQLで使えるGroonga Groongaのフル機能は諦める 速度など譲れない部分はがんばる その分、使いやすさを重視 使いやすさ1= MySQL・PostgreSQLとなじんでいる 使いやすさ2= MySQL・PostgreSQLの不便を解消
  • 26. Mroonga と PGroonga - Groongaを使って MySQLとPostgreSQLで日本語全文検索 Powered by Rabbit 2.1.9 なじみ度:Mroonga インデックス作成:MySQLと同じ CREATE TABLE ... ( ..., FULLTEXT INDEX (column) ) ENGINE=Mroonga;
  • 27. Mroonga と PGroonga - Groongaを使って MySQLとPostgreSQLで日本語全文検索 Powered by Rabbit 2.1.9 なじみ度:Mroonga 全文検索:MySQLと同じ SELECT * FROM ... WHERE MATCH(column) AGAINST('キーワード' IN BOOLEAN MODE);
  • 28. Mroonga と PGroonga - Groongaを使って MySQLとPostgreSQLで日本語全文検索 Powered by Rabbit 2.1.9 不便解消:Mroonga デフォルトOR→AND -- ↓AまたはBが含まれていればマッチ AGAINST('A B' IN BOOLEAN MODE); AGAINST('+A +B' IN BOOLEAN MODE); -- ↑↓AとBが含まれていればマッチ -- ↓Mroongaの拡張 AGAINST('*D+ A B' IN BOOLEAN MODE);
  • 29. Mroonga と PGroonga - Groongaを使って MySQLとPostgreSQLで日本語全文検索 Powered by Rabbit 2.1.9 不便解消:Mroonga 重み指定 -- titleかcontentにAがあればマッチ -- (便利。PostgreSQLではできない。) MATCH(title, content) AGAINST('A' IN BOOLEAN MODE) -- でもtitleの方を重要視したい! -- ↓Mroongaの拡張 AGAINST('*W1:10,2:1 A' IN BOOLEAN MODE)
  • 30. Mroonga と PGroonga - Groongaを使って MySQLとPostgreSQLで日本語全文検索 Powered by Rabbit 2.1.9 不便解消:Mroonga 全文検索+ORDER LIMIT高速化 SELECT * FROM tweets WHERE MATCH(content) AGAINST('...' IN BOOLEAN MODE) ORDER BY timestamp DESC LIMIT 10;
  • 31. Mroonga と PGroonga - Groongaを使って MySQLとPostgreSQLで日本語全文検索 Powered by Rabbit 2.1.9 ORDER LIMIT高速化 なぜ速いか Groongaでソートし、LIMIT件だけ MySQLに返しているから MySQLよりGroongaでやった方が速い (ヒント:カラムストア)
  • 32. Mroonga と PGroonga - Groongaを使って MySQLとPostgreSQLで日本語全文検索 Powered by Rabbit 2.1.9 さらにORDER LIMIT高速化 SELECT * FROM tweets WHERE MATCH(content) AGAINST('...' IN BOOLEAN MODE) AND timestamp >= '2016-02-01' -- ↑今月の分だけ対象にしたい ORDER BY timestamp DESC LIMIT 10;
  • 33. Mroonga と PGroonga - Groongaを使って MySQLとPostgreSQLで日本語全文検索 Powered by Rabbit 2.1.9 さらにORDER LIMIT高速化 なぜ速いか Groongaで絞り込んでソートし、 LIMIT件だけMySQLに返しているから MySQLよりGroongaでやった方が速い (ヒント:カラムストア) 場合によっては10倍以上高速化 http://tech.gmo-media.jp/post/69542751128/ mroonga-311-new-optimization
  • 34. Mroonga と PGroonga - Groongaを使って MySQLとPostgreSQLで日本語全文検索 Powered by Rabbit 2.1.9 PGroonga Groongaのフル機能は諦める 速度など譲れない部分はがんばる その分、使いやすさを重視 使いやすさ1= MySQL・PostgreSQLとなじんでいる 使いやすさ2= MySQL・PostgreSQLの不便を解消
  • 35. Mroonga と PGroonga - Groongaを使って MySQLとPostgreSQLで日本語全文検索 Powered by Rabbit 2.1.9 なじみ度:PGroonga インデックス作成: PostgreSQLと同じ CREATE INDEX name ON texts USING pgroonga (content);
  • 36. Mroonga と PGroonga - Groongaを使って MySQLとPostgreSQLで日本語全文検索 Powered by Rabbit 2.1.9 なじみ度:PGroonga 全文検索: PostgreSQLのtextsearchとほぼ同 じ SELECT * FROM ... WHERE column @@ 'キーワード';
  • 37. Mroonga と PGroonga - Groongaを使って MySQLとPostgreSQLで日本語全文検索 Powered by Rabbit 2.1.9 textsearchとの違い 構文 -- textsearch -- プログラムのよう '(A & B) | C' -- PGroonga(不便解消) -- Web検索エンジンのよう '(A B) OR C'
  • 38. Mroonga と PGroonga - Groongaを使って MySQLとPostgreSQLで日本語全文検索 Powered by Rabbit 2.1.9 不便解消:PGroonga Windows用バイナリーあり 商用ログ管理製品 「VVAULT AUDIT」が採用 http://vvault.jp/product/vvault-audit/ アクセスログに対して ユーザー名・パスを全文検索 決め手:高速・省スペース
  • 39. Mroonga と PGroonga - Groongaを使って MySQLとPostgreSQLで日本語全文検索 Powered by Rabbit 2.1.9 不便解消:PGroonga JSONデータを全文検索 CREATE TABLE logs (record jsonb); CREATE INDEX i ON logs USING pgroonga (record); -- ログのどこかに「error」があればマッチ SELECT * FROM logs WHERE record @@ 'string @ "error"';
  • 40. Mroonga と PGroonga - Groongaを使って MySQLとPostgreSQLで日本語全文検索 Powered by Rabbit 2.1.9 JSON全文検索例 以下は全部マッチ {"message": "Error!"} {"tags": ["web", "error"]} {"syslog": {"message": "error!"}}
  • 41. Mroonga と PGroonga - Groongaを使って MySQLとPostgreSQLで日本語全文検索 Powered by Rabbit 2.1.9 使いたい!? HerokuのPostgreSQLで PGroongaを使えるなら Herokuを使いたい! #herokujp ↑と思うならtweet! (Herokuの人が観測します。)
  • 42. Mroonga と PGroonga - Groongaを使って MySQLとPostgreSQLで日本語全文検索 Powered by Rabbit 2.1.9 まとめ1 Groonga(ぐるんが) 国産の高速全文検索エンジン Mroonga(むるんが) MySQLからGroongaを使える! PGroonga(ぴーじーるんが) PostgreSQLからGroongaを使える!
  • 43. Mroonga と PGroonga - Groongaを使って MySQLとPostgreSQLで日本語全文検索 Powered by Rabbit 2.1.9 まとめ2 実装方針 Groongaをできるだけ活かす (例:速度) MySQL/PostgreSQLっぽく使える MySQL/PostgreSQLをより便利に
  • 44. Mroonga と PGroonga - Groongaを使って MySQLとPostgreSQLで日本語全文検索 Powered by Rabbit 2.1.9 次回予告 トランザクションは? クラッシュしたら? レプリケーションは? もっと速くならないの?