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