Rabbit Slide Show

Mroonga開発者が来たぞ!

2016-11-17

Description

2016年11月17日(木)開催の三木会でのMroonga紹介資料。

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

Other slides

Apache Arrow
2017-06-13
Apache Arrow
2017-05-28
Mroonga!
2015-10-30