MySQL Casual Talks Vol.4 「MySQL-5.6で始める全文検索 〜InnoDB FTS編〜」

24,283 views

Published on

MySQL Casual Talks Vol.4 でのライトニングトークに利用した資料です。
MySQL-5.6.4より「InnoDB FTS」としてInnoDBで全文検索機能が加わりました。
この全文検索機能を利用し、日本語の全文検索エンジンとしての可能性を探ります。

ブログ記事はこちらです。
http://y-ken.hatenablog.com/entry/mysql-casual-talks-vol4-innodb-fts

Published in: Technology
0 Comments
22 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
24,283
On SlideShare
0
From Embeds
0
Number of Embeds
11,173
Actions
Shares
0
Downloads
43
Comments
0
Likes
22
Embeds 0
No embeds

No notes for slide

MySQL Casual Talks Vol.4 「MySQL-5.6で始める全文検索 〜InnoDB FTS編〜」

  1. 1. MySQL-5.6で始める全文検索∼InnoDB FTS編∼MySQL Casual Talks #4Kentaro Yoshida@yoshi_ken
  2. 2. 本日の流れ自己紹介今回のテーマMySQL-5.6時代の全文検索プロダクト紹介全文検索の動作デモベンチマークまとめ次回予告
  3. 3. 自己紹介よしけんさんの中の人研究開発系のインフラエンジニア興味分野MySQL, Fluentd, Ruby,KVM, DRBD, Nginx,Redis, MongoDB, etc...
  4. 4. 今回のテーマMySQL-5.6.4のInnoDBでは全文検索が可能となったしかしMeCabTokenizerどころかNgramにすら非対応スペース区切りなら検索できる!(ポジティブ思考)自前で分かち書きすれば動くのでは?でも速度は?こんな状況に果敢に挑戦したレポートです
  5. 5. MySQL-5.6時代の全文検索プロダクト紹介(mroonga / InnoDB-FTS / SphinxSE)
  6. 6. mroongahttp://mroonga.github.io/ja/docs/characteristic.html
  7. 7. InnoDB Full-Text Searchhttps://blogs.oracle.com/mysqlinnodb/entry/innodb_full_text_search_is
  8. 8. SphinxSEhttp://sphinxsearch.com/これは別物
  9. 9. mroonga (groonga)Tritonn (Senna) の後継プロダクト参照ロックフリー完全転置索引を採用MeCabやN-gramでの分かち書きに対応N-gramおよびCJKに対応
  10. 10. InnoDB FTS (FullTextSearch)MySQL-5.6.4から正式対応(しかも標準)参照ロックフリーmroonga (groonga) 同様に完全転置索引を採用空白区切りの単語のみ検索可能現状、N-gramおよびCJKには非対応
  11. 11. Sphinx SE (Search Engine)概要 by wikipediahttp://en.wikipedia.org/wiki/Sphinx_(search_engine)日本語解説 by IBMhttp://www.ibm.com/developerworks/jp/opensource/library/os-sphinx/?cmp=dw&cpb=dwope&ct=dwrss&cr=dwrss&ccy=jp&csr=120911storage plugin対応http://sphinxsearch.com/docs/current.html#sphinxse-usingリアルタイムインデックス非対応(疑惑)http://www.slideshare.net/conmame/ss-12117195/9ベンチマークhttp://www.percona.com/files//presentations/opensql2008_sphinx.pdfhttp://www.slideshare.net/billkarwin/practical-full-text-search-with-my-sqlインストール方法http://www.howtoforge.com/sphinx-as-mysql-storage-engine-sphinxse日本語 (CJK) 対応状況http://www.ivinco.com/blog/using-sphinx-search-engine-with-chinese-japanese-and-korean-language-documents/MySQL-5.6.10対応状況http://sphinxsearch.com/bugs/view.php?id=1419
  12. 12. 全文検索デモ (mroonga)テーブル作成CREATE TABLE search_with_mroonga (id INT PRIMARY KEY AUTO_INCREMENT,subject TEXT,content TEXT,FULLTEXT INDEX (subject,content)) ENGINE = mroonga DEFAULT CHARSET utf8collate utf8_unicode_ci ;
  13. 13. 全文検索デモ (mroonga)データ登録INSERT INTO search_with_mroonga(subject, content) VALUES (‘MySQL’,’MySQL(マイエスキューエル)は、オラクルが開発するRDBMS(リレーショナルデータベースを管理、運用するためのシステム)の実装の一つである。’);
  14. 14. 全文検索デモ (mroonga)データ検索SELECT*FROMsearch_with_mroongaWHEREMATCH(subject,content)AGAINST(+オラクル IN BOOLEAN MODE);
  15. 15. 全文検索デモ (InnoDB FTS)テーブル作成CREATE TABLE search_with_innodb (id INT PRIMARY KEY AUTO_INCREMENT,subject TEXT,content TEXT,FULLTEXT INDEX (subject,content)) ENGINE=InnoDB DEFAULT CHARSET utf8collate utf8_unicode_ci ;
  16. 16. 全文検索デモ (InnoDB FTS)分かち書き with CLIecho "MySQL(マイエスキューエル)は、オラクルが開発するRDBMS(リレーショナルデータベースを管理、運用するためのシステム)の実装の一つである。" |mecab --output-format-type wakati
  17. 17. 全文検索デモ (InnoDB FTS)分かち書き with Ruby# -*- encoding: utf-8 -*-require MeCabwakati = MeCab::Tagger.new(-O wakati)puts wakati.parse(本日も良い天気です)
  18. 18. 全文検索デモ (InnoDB FTS)データ登録INSERT INTO search_with_innodb(subject, content) VALUES (‘MySQL’,’MySQL ( マイエスキューエル ) は 、 オラクル が 開発 する RDBMS ( リレーショナル データベース を 管理 、 運用 する ため の システム )の 実装 の 一つ で ある 。’);
  19. 19. 全文検索デモ (InnoDB FTS)データ検索SELECT*FROMsearch_with_innodbWHEREMATCH(subject,content)AGAINST(+オラクル IN BOOLEAN MODE);
  20. 20. ベンチマークOracle公式MySQL-5.6.10にmroonga-3.02を入れ、mroongaとInnoDB-FTSの性能比較試験を行う書き込み性能全文検索性能利用マシンIntel Xeon L5520 2.27GHz, 16GB MemoryCentOS 6.4 (x86_64)
  21. 21. ベンチマークテーブル構成mroonga ストレージモードインデックス作成時のオプションにて分かち書き方法を指定するsearch_with_mroonga_ngramsearch_with_mroonga_mecab
  22. 22. ベンチマークsearch_with_mroonga_ngramCREATE TABLE search_with_mroonga_ngram (id INT PRIMARY KEY AUTO_INCREMENT,subject TEXT,content TEXT,FULLTEXT (subject,content)) ENGINE=mroonga DEFAULT CHARSET utf8collate utf8_unicode_ci ;
  23. 23. ベンチマークsearch_with_mroonga_mecabCREATE TABLE search_with_mroonga_mecab (id INT PRIMARY KEY AUTO_INCREMENT,subject TEXT,content TEXT,FULLTEXT (subject,content) COMMENTparser "TokenMecab") ENGINE=mroonga DEFAULT CHARSET utf8collate utf8_unicode_ci ;
  24. 24. ベンチマークテーブル構成InnoDB FTS分かち書き機能を内蔵していないため、事前にRubyプログラムにて分かち書きを行うsearch_with_innodb_ngramsearch_with_innodb_mecab
  25. 25. ベンチマークsearch_with_innodb_ngramCREATE TABLE search_with_innodb_ngram (id INT PRIMARY KEY AUTO_INCREMENT,subject TEXT,content TEXT,FULLTEXT (subject,content)) ENGINE=InnoDB DEFAULT CHARSET utf8collate utf8_unicode_ci ;
  26. 26. ベンチマークsearch_with_innodb_mecabCREATE TABLE search_with_innodb_mecab (id INT PRIMARY KEY AUTO_INCREMENT,subject TEXT,content TEXT,FULLTEXT (subject,content)) ENGINE=InnoDB DEFAULT CHARSET utf8collate utf8_unicode_ci ;
  27. 27. ベンチ:更新性能5万件×15回のINSERT所要秒数を計測し、件数が増えることでの性能劣化を測りますサンプルデータには、dbpedia.org より入手したWikipedia日本語版の75万件の記事を利用します
  28. 28. ベンチ:更新性能tsvデータの容量ngramはbi-gramのため、2倍以上の容量となります。$ ls -sh wikipedia_*.tsv408M wikipedia_mecab.tsv798M wikipedia_ngram.tsv345M wikipedia_plain.tsv
  29. 29. ベンチ:更新性能クエリ例LOAD DATA LOCAL INFILE/path/to/wikipedia_mecab.tsvINTO TABLE search_with_innodb_mecabFIELDS TERMINATED BY tLINES TERMINATED BY n(id,subject,content);
  30. 30. ベンチ:更新性能0100020003000400075万件の登録所要時間(秒)3054.54329.8629.57178.01mroonga mecabInnoDB FTS mecabmroonga ngramInnoDB FTS ngram
  31. 31. tsvデータを5万行毎のファイル15個に分割し、LOAD DATA LOCAL INFILEを立て続けに行った際、速度がどのように変化していくかを計測しました。
  32. 32. ベンチ:更新性能010020030040050k 100k 150k 200k 250k 300k 350k 400k 450k 500k 550k 600k 650k 700k 750kmroonga mecabInnoDB FTS mecabmroonga ngramInnoDB FTS ngram5万件単位での書き込み所要時間(秒)
  33. 33. 5万件単位での書き込み所要時間を計測したところ、InnoDB FTS ngramはダントツで遅いため、グラフから外し、MeCabのみで比較します。
  34. 34. ベンチ:更新性能01530456050k 100k 150k 200k 250k 300k 350k 400k 450k 500k 550k 600k 650k 700k 750kmroonga mecabInnoDB FTS mecab5万件単位での書き込み所要時間(秒)
  35. 35. ベンチ:更新性能結果mroongaがダントツで最速InnoDB FTSもMeCabデータを入れるなら業務要件次第では実用的な範囲
  36. 36. ベンチ:全文検索性能5万件の単語を直列に全文検索する際の所要秒数を計測し、全文検索性能の比較を行います単語データは、MeCab-IPA辞書の名詞版(固有名詞・地域)から5万件を抽出しています$ nkf -w src/mecab-ipadic-2.7.0-20070801/Noun.place.csv | cut -d"," -f1 | sort |uniq | sort -R | head -n 50000
  37. 37. ベンチ:全文検索性能クエリ例SELECTSQL_NO_CACHEcount(*)FROMsearch_with_innodb_mecabWHEREmatch(subject,content)against(+表参道 IN BOOLEAN MODE);
  38. 38. ベンチ:全文検索性能1ワード0 50 100 150 20061.638187.94455.152163.824mroonga mecabInnoDB FTS mecabmroonga ngramInnoDB FTS ngram75万レコードに対して5万単語を順次SELECTした際の実行所要時間(秒)
  39. 39. 5万単語を用意して直列に順次検索を行いましたが、該当件数が0件となる単語が半数ある事を補足します。search_with_mroonga_mecab:Noresult count: 33658search_with_innodb_mecab:Noresult count: 24950search_with_mroonga_ngram:Noresult count: 23129search_with_innodb_ngram:Noresult count: 35500
  40. 40. まとめMySQL-5.6.4 以降で使えるようになったInnoDB FTSは意外と実用的ですInnoDB FTSを使うならアプリ側でMeCabを用いた分かち書きをしましょうMySQL単体で全文検索を実現したい場合のmroonga以外の選択肢が、1つ増えました
  41. 41. 最後に詳細な解説記事は追ってアップします。その際はTwitterにてお知らせします。https://twitter.com/yoshi_kenhttp://d.hatena.ne.jp/yoshi-ken/
  42. 42. 次回予告
  43. 43. 次回予告Tritonn (MySQL-5.0.87+Senna)からのmroonga (MySQL-5.6) 移行ガイド
  44. 44. ご清聴ありがとうございました。

×