Text
Page: 1
Mroonga開発者が
来たぞ!
須藤功平
クリアコード
三木会
2016-11-17
Mroonga開発者が 来たぞ!
Powered by Rabbit 2.2.0
Page: 2
Mroonga
読み方:むるんが
ストレージエンジン
MySQL 5.7対応
もちろん5.5, 5.6も対応
MariaDB 10.2対応
もちろん5.5, 10.0, 10.1も対応
10.0以降はバンドルもされている
Mroonga開発者が 来たぞ!
Powered by Rabbit 2.2.0
Page: 3
特徴
高速日本語全文検索 (全言語OK)
MySQL 5.6以前は日本語未対応
5.7以降は日本語対応しているが遅い
カラムストアによる高速処理
全文検索初心者でも使える
全文検索上級者は活用できる
Mroonga開発者が 来たぞ!
Powered by Rabbit 2.2.0
Page: 4
高速日本語全文検索
1. ベンチマーク
2. 速さの秘密
Mroonga開発者が 来たぞ!
Powered by Rabbit 2.2.0
Page: 5
ベンチマーク環境
対象:Wikipedia日本語版
レコード数:約185万件
データサイズ:約7GB
メモリー4GB・SSD250GB (ConoHa)
Mroonga開発者が 来たぞ!
Powered by Rabbit 2.2.0
Page: 6
補足
MySQL 5.7を使用
他人のベンチマークは参考程度
検討時は実環境でベンチマークを!
詳細:
https://github.com/groonga/wikipedia-search/issues/4
Mroonga開発者が 来たぞ!
Powered by Rabbit 2.2.0
Page: 7
検索1
キーワード:テレビアニメ
(ヒット数:約2万3千件)
InnoDB ngram
InnoDB MeCab
Mroonga:1
Mroonga開発者が 来たぞ!
3m2s
6m20s
0.11s
Powered by Rabbit 2.2.0
Page: 8
検索2
キーワード:データベース
(ヒット数:約1万7千件)
InnoDB ngram
InnoDB MeCab:1
Mroonga:2
Mroonga開発者が 来たぞ!
36s
0.03s
0.09s
Powered by Rabbit 2.2.0
Page: 9
検索3
キーワード:PostgreSQL OR MySQL
(ヒット数:約400件)
InnoDB ngram
N/A(Error)
InnoDB MeCab:1
0.005s
Mroonga:2
0.028s
Mroonga開発者が 来たぞ!
Powered by Rabbit 2.2.0
Page: 10
検索4
キーワード:日本
(ヒット数:約63万件)
InnoDB ngram
InnoDB MeCab
Mroonga:1
Mroonga開発者が 来たぞ!
1.3s
1.3s
0.21s
Powered by Rabbit 2.2.0
Page: 11
検索まとめ
Mroonga:安定して速い
InnoDB FTS MeCab
ハマれば速い
InnoDB FTS ngram
安定して遅い
Mroonga開発者が 来たぞ!
Powered by Rabbit 2.2.0
Page: 12
速さの秘密
最適化された転置索引実装
2段階のデータ圧縮
高速なポスティングリスト探索
検索だけでなく更新も速い
11年以上開発が続いている全文検索エンジンGroongaを使用
Mroonga開発者が 来たぞ!
Powered by Rabbit 2.2.0
Page: 13
もっと速さの秘密
カラムストアを活かした最適化
ポイント1:余計なI/Oを減らす
ポイント2:I/Oを局所化
Mroonga開発者が 来たぞ!
Powered by Rabbit 2.2.0
Page: 14
カラムストア
カラム
a b c
Mroonga
1 値 値 値
カラム
a b c
InnoDB他
2 値 値 値
3 値 値 値
1 値 値 値
2 値 値 値
3 値 値 値
カラムごと 値の管理単位 行ごと
カラム 高速なアクセス単位 行
Mroonga開発者が 来たぞ!
Powered by Rabbit 2.2.0
Page: 15
必要なカラムのみアクセス
-- aのみにアクセス
SELECT a
FROM table
-- cのみにアクセス
WHERE c = XXX;
-- bにはアクセスしない
Mroonga開発者が 来たぞ!
Powered by Rabbit 2.2.0
Page: 16
減ったI/O
1 値 値 値
2 値 値 値
Mroonga
カラム
a b c
InnoDB他
アクセスしない
カラム
a b c
3 値 値 値
1 値 値 値
2 値 値 値
3 値 値 値
カラムごと 値の管理単位 行ごと
カラム 高速なアクセス単位 行
Mroonga開発者が 来たぞ!
Powered by Rabbit 2.2.0
Page: 17
行カウント
-- カラムの値は必要ない
SELECT COUNT(*)
FROM table
-- cの全文検索インデックスにだけアクセス
WHERE MATCH(c)
AGAINST('+keyword' IN BOOLEAN MODE);
-- a, b, cはアクセスしない
Mroonga開発者が 来たぞ!
Powered by Rabbit 2.2.0
Page: 18
減ったI/O
1 値 値 値
2 値 値 値
Mroonga
カラム
a b c
InnoDB他
アクセスしない
カラム
a b c
3 値 値 値
1 値 値 値
2 値 値 値
3 値 値 値
カラムごと 値の管理単位 行ごと
カラム 高速なアクセス単位 行
Mroonga開発者が 来たぞ!
Powered by Rabbit 2.2.0
Page: 19
ORDER BY LIMIT
SELECT *
FROM table
WHERE MATCH(c)
AGAINST('+keyword' IN BOOLEAN MODE)
-- MySQLではなくMroongaがORDER BY LIMITを処理
-- →Mroongaは10レコードだけMySQLに返す
-- マッチしたレコードすべては返さない
ORDER BY a LIMIT 10;
Mroonga開発者が 来たぞ!
Powered by Rabbit 2.2.0
Page: 20
ORDER BY LIMITの最適化
Mroongaが検索
カラム毎の処理でI/Oを局所化
(索引非使用時)
Mroongaがソート
カラム毎の処理でI/Oを局所化
MroongaがOFFSET/LIMITを処理
Mroonga開発者が 来たぞ!
Powered by Rabbit 2.2.0
Page: 21
カラム毎の処理は速い
カラム
a b c
Mroonga
1 値 値 値
2 値 値 値
カラム
a b c
InnoDB他
3 値 値 値
1 値 値 値
2 値 値 値
3 値 値 値
カラムごと 値の管理単位 行ごと
カラム 高速なアクセス単位 行
Mroonga開発者が 来たぞ!
Powered by Rabbit 2.2.0
Page: 22
最適化のまとめ
転置索引実装が速い
検索も更新も速い
カラムストアで速い
ポイント:I/O削減・I/O局所化
Mroonga開発者が 来たぞ!
Powered by Rabbit 2.2.0
Page: 23
全文検索初心者でも使える
インストールが簡単
MySQLの標準機能のみで使える
Mroonga開発者が 来たぞ!
Powered by Rabbit 2.2.0
Page: 24
インストールが簡単
APT/Yumリポジトリー
MariaDBバンドル
MariaDB込みのWindowsバイナリ
Mroonga開発者が 来たぞ!
Powered by Rabbit 2.2.0
Page: 25
標準機能のみで使える
-- 作成
CREATE TABLE table (
-- ...,
FULLTEXT INDEX (column)
) ENGINE=Mroonga;
Mroonga開発者が 来たぞ!
Powered by Rabbit 2.2.0
Page: 26
標準機能のみで使える
-- 変換
ALTER TABLE table
ADD FULLTEXT INDEX (column)
ENGINE=Mroonga;
Mroonga開発者が 来たぞ!
Powered by Rabbit 2.2.0
Page: 27
標準機能のみで使える
SELECT * FROM table
WHERE
MATCH(column)
AGAINST('+keyword'
IN BOOLEAN MODE);
Mroonga開発者が 来たぞ!
Powered by Rabbit 2.2.0
Page: 28
全文検索上級者向け機能
カスタマイズ
デフォルト値はいい感じ
→初心者はカスタマイズなしでよい
Groongaの機能をもっと使える
(高速・高機能)
Mroonga開発者が 来たぞ!
Powered by Rabbit 2.2.0
Page: 29
文字正規化ルール変更
CREATE TABLE table (
-- ...,
FULLTEXT INDEX (column)
--
-- コメントでパラメーターを指定
COMMENT='normalizer "NormalizerAuto"'
) ENGINE=Mroonga;
Mroonga開発者が 来たぞ!
Powered by Rabbit 2.2.0
Page: 30
文字正規化ルール変更
CREATE TABLE table (
-- ...,
FULLTEXT INDEX (column)
-- MariaDBの場合:
-- カスタムパラメーターを使える
NORMALIZER='NormalizerAuto'
) ENGINE=Mroonga;
Mroonga開発者が 来たぞ!
Powered by Rabbit 2.2.0
Page: 31
Groongaの検索機能を使う
SELECT * FROM table
WHERE
-- 「*SS」プラグマ使用時は「c1」は無視される
MATCH(c1)
-- 「*SS」はGroongaの全検索機能を使うためのプラグマ
-- 1つのクエリーで複数のインデックスを使用可能
AGAINST('*SS c1 @ "keyword" && c2 < 100'
IN BOOLEAN MODE);
Mroonga開発者が 来たぞ!
Powered by Rabbit 2.2.0
Page: 32
今後
最新機能サポート
JSONを全文検索
(JSON型のデータの読み書きは対応済み)
仮想カラム・生成カラム
パーティショニング+全文検索対応
最新版をMariaDBにバンドル
Mroonga開発者が 来たぞ!
Powered by Rabbit 2.2.0
Page: 33
最新版をバンドル
Mroongaは毎月リリース
MariaDB 10.2.1はMroonga 5.04
をバンドル
Mroongaの最新版は6.10
Mroongaは6.03からMariaDB 10.2を
サポート
現在テスト中→テスト対応後マージ
Mroonga開発者が 来たぞ!
Powered by Rabbit 2.2.0
Page: 34
まとめ1
高速日本語全文検索 (全言語OK)
カラムストアによる高速処理
全文検索初心者でも使える
全文検索上級者は活用できる
Mroonga開発者が 来たぞ!
Powered by Rabbit 2.2.0
Page: 35
まとめ2
今後もMroongaは便利になる
MariaDBで最新Mroongaを使える
MySQLで全文検索ならMroonga!
Mroonga開発者が 来たぞ!
Powered by Rabbit 2.2.0