Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
Mroonga開発者が 来たぞ! Powered by Rabbit 2.2.0
Mroonga開発者が
来たぞ!
須藤功平 クリアコード
三木会
2016-11-17
Mroonga開発者が 来たぞ! Powered by Rabbit 2.2.0
Mroonga
読み方:むるんが
ストレージエンジン
MySQL 5.7対応
もちろん5.5, 5.6も対応
MariaDB 10.2対応
もちろん5.5, 10...
Mroonga開発者が 来たぞ! Powered by Rabbit 2.2.0
特徴
高速日本語全文検索(全言語OK)
MySQL 5.6以前は日本語未対応
5.7以降は日本語対応しているが遅い
カラムストアによる高速処理
全文検索初心者でも...
Mroonga開発者が 来たぞ! Powered by Rabbit 2.2.0
高速日本語全文検索
ベンチマーク1.
速さの秘密2.
Mroonga開発者が 来たぞ! Powered by Rabbit 2.2.0
ベンチマーク環境
対象:Wikipedia日本語版
レコード数:約185万件
データサイズ:約7GB
メモリー4GB・SSD250GB(ConoHa)
Mroonga開発者が 来たぞ! Powered by Rabbit 2.2.0
補足
MySQL 5.7を使用
他人のベンチマークは参考程度
検討時は実環境でベンチマークを!
詳細:
https://github.com/groonga/wi...
Mroonga開発者が 来たぞ! Powered by Rabbit 2.2.0
検索1
キーワード:テレビアニメ
(ヒット数:約2万3千件)
InnoDB ngram 3m2s
InnoDB MeCab 6m20s
Mroonga:1 0.1...
Mroonga開発者が 来たぞ! Powered by Rabbit 2.2.0
検索2
キーワード:データベース
(ヒット数:約1万7千件)
InnoDB ngram 36s
InnoDB MeCab:1 0.03s
Mroonga:2 0....
Mroonga開発者が 来たぞ! Powered by Rabbit 2.2.0
検索3
キーワード:PostgreSQL OR MySQL
(ヒット数:約400件)
InnoDB ngram N/A(Error)
InnoDB MeCab:1...
Mroonga開発者が 来たぞ! Powered by Rabbit 2.2.0
検索4
キーワード:日本
(ヒット数:約63万件)
InnoDB ngram 1.3s
InnoDB MeCab 1.3s
Mroonga:1 0.21s
Mroonga開発者が 来たぞ! Powered by Rabbit 2.2.0
検索まとめ
Mroonga:安定して速い
InnoDB FTS MeCab
ハマれば速い
InnoDB FTS ngram
安定して遅い
Mroonga開発者が 来たぞ! Powered by Rabbit 2.2.0
速さの秘密
最適化された転置索引実装
2段階のデータ圧縮
高速なポスティングリスト探索
検索だけでなく更新も速い
11年以上開発が続いている全文検索エンジンGro...
Mroonga開発者が 来たぞ! Powered by Rabbit 2.2.0
もっと速さの秘密
カラムストアを活かした最適化
ポイント1:余計なI/Oを減らす
ポイント2:I/Oを局所化
Mroonga開発者が 来たぞ! Powered by Rabbit 2.2.0
カラムストア
カラム
行
a b c
1
2
3
値 値 値
値 値 値
値 値 値
カラム
行
a b c
1
2
3
値 値 値
値 値 値
値 値 値
Mr...
Mroonga開発者が 来たぞ! Powered by Rabbit 2.2.0
必要なカラムのみアクセス
-- aのみにアクセス
SELECT a
FROM table
-- cのみにアクセス
WHERE c = XXX;
-- bにはアクセ...
Mroonga開発者が 来たぞ! Powered by Rabbit 2.2.0
減ったI/O
カラム
行
a b c
1
2
3
値 値 値
値 値 値
値 値 値
カラム
行
a b c
1
2
3
値 値 値
値 値 値
値 値 値
Mr...
Mroonga開発者が 来たぞ! Powered by Rabbit 2.2.0
行カウント
-- カラムの値は必要ない
SELECT COUNT(*)
FROM table
-- cの全文検索インデックスにだけアクセス
WHERE MATCH...
Mroonga開発者が 来たぞ! Powered by Rabbit 2.2.0
減ったI/O
カラム
行
a b c
1
2
3
値 値 値
値 値 値
値 値 値
カラム
行
a b c
1
2
3
値 値 値
値 値 値
値 値 値
Mr...
Mroonga開発者が 来たぞ! Powered by Rabbit 2.2.0
ORDER BY LIMIT
SELECT *
FROM table
WHERE MATCH(c)
AGAINST('+keyword' IN BOOLEAN M...
Mroonga開発者が 来たぞ! Powered by Rabbit 2.2.0
ORDER BY LIMITの最適化
Mroongaが検索
カラム毎の処理でI/Oを局所化
(索引非使用時)
Mroongaがソート
カラム毎の処理でI/Oを局所...
Mroonga開発者が 来たぞ! Powered by Rabbit 2.2.0
カラム毎の処理は速い
カラム
行
a b c
1
2
3
値 値 値
値 値 値
値 値 値
カラム
行
a b c
1
2
3
値 値 値
値 値 値
値 値 ...
Mroonga開発者が 来たぞ! Powered by Rabbit 2.2.0
最適化のまとめ
転置索引実装が速い
検索も更新も速い
カラムストアで速い
ポイント:I/O削減・I/O局所化
Mroonga開発者が 来たぞ! Powered by Rabbit 2.2.0
全文検索初心者でも使える
インストールが簡単
MySQLの標準機能のみで使える
Mroonga開発者が 来たぞ! Powered by Rabbit 2.2.0
インストールが簡単
APT/Yumリポジトリー
MariaDBバンドル
MariaDB込みのWindowsバイナリ
Mroonga開発者が 来たぞ! Powered by Rabbit 2.2.0
標準機能のみで使える
-- 作成
CREATE TABLE table (
-- ...,
FULLTEXT INDEX (column)
) ENGINE=Mr...
Mroonga開発者が 来たぞ! Powered by Rabbit 2.2.0
標準機能のみで使える
-- 変換
ALTER TABLE table
ADD FULLTEXT INDEX (column)
ENGINE=Mroonga;
Mroonga開発者が 来たぞ! Powered by Rabbit 2.2.0
標準機能のみで使える
SELECT * FROM table
WHERE
MATCH(column)
AGAINST('+keyword'
IN BOOLEAN ...
Mroonga開発者が 来たぞ! Powered by Rabbit 2.2.0
全文検索上級者向け機能
カスタマイズ
デフォルト値はいい感じ
→初心者はカスタマイズなしでよい
Groongaの機能をもっと使える
(高速・高機能)
Mroonga開発者が 来たぞ! Powered by Rabbit 2.2.0
文字正規化ルール変更
CREATE TABLE table (
-- ...,
FULLTEXT INDEX (column)
--
-- コメントでパラメーター...
Mroonga開発者が 来たぞ! Powered by Rabbit 2.2.0
文字正規化ルール変更
CREATE TABLE table (
-- ...,
FULLTEXT INDEX (column)
-- MariaDBの場合:
--...
Mroonga開発者が 来たぞ! Powered by Rabbit 2.2.0
Groongaの検索機能を使う
SELECT * FROM table
WHERE
-- 「*SS」プラグマ使用時は「c1」は無視される
MATCH(c1)
--...
Mroonga開発者が 来たぞ! Powered by Rabbit 2.2.0
今後
最新機能サポート
JSONを全文検索
(JSON型のデータの読み書きは対応済み)
仮想カラム・生成カラム
パーティショニング+全文検索対応
最新版をMari...
Mroonga開発者が 来たぞ! Powered by Rabbit 2.2.0
最新版をバンドル
Mroongaは毎月リリース
MariaDB 10.2.1はMroonga 5.04
をバンドル
Mroongaの最新版は6.10
Mroong...
Mroonga開発者が 来たぞ! Powered by Rabbit 2.2.0
まとめ1
高速日本語全文検索(全言語OK)
カラムストアによる高速処理
全文検索初心者でも使える
全文検索上級者は活用できる
Mroonga開発者が 来たぞ! Powered by Rabbit 2.2.0
まとめ2
今後もMroongaは便利になる
MariaDBで最新Mroongaを使える
MySQLで全文検索ならMroonga!
Upcoming SlideShare
Loading in …5
×

Mroonga開発者が来たぞ!

307 views

Published on

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

Published in: Technology
  • Be the first to comment

  • Be the first to like this

Mroonga開発者が来たぞ!

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

×