Kouhei Sutou
kou****@clear*****
2013年 4月 25日 (木) 10:20:38 JST
須藤です。 In <34294****@web10*****> "[groonga-dev,01325] Re: utf8_unicode_ci使用時の検索結果について" on Wed, 24 Apr 2013 20:32:37 +0900 (JST), <mail_babir****@yahoo*****> wrote: > ただ、phpMyAdminの場合、検索での取得レコードを制限していない場合でも、内部で自動的にlimit句が付加されており、この点が考慮できていませんでした。 > > SELECT * FROM `test` WHERE MATCH (`main`) AGAINST ('と*' IN BOOLEAN MODE); > の実行時間を比較したつもりだったが、実際には > SELECT * FROM `test` WHERE MATCH (`main`) AGAINST ('と*' IN BOOLEAN MODE) LIMIT 0 , 30; > の実行時間を比較していた。 > > そこで、改めて自作のphpスクリプトでクエリ発行前後のmicrotime差分を計測してみたところ、やはりlimit句の有無でmroongaとmyisamでの検索速度に大きく差が出ていることがわかりました。 > > 全体27,030件、全文インデックス(mroongaはTokenDelimit)を貼ったmyisam,mroongaの2つのテーブルを用意して、それぞれに18020件がヒットする前方一致のSELECT文を発行。 > > ・limitなし(18020件中18020件取得) > myisam : 0.1610sec > mroonga : 0.0925sec > > ・limitあり(18020件中1件取得) > myisam : 0.0019sec > mroonga : 0.0148sec > > ・count(*) > myisam : 0.1076sec > mroonga : 0.0333sec > > limit句がある場合、myisamでは約85倍の高速化が実現していますが、 > mroongaでは6倍の高速化に留まっている点が、phpMyAdmin上での検索時間の差として出て来たものと思われます。 おぉ、なるほど! > limit句がある場合、myisamの方がmroongaよりも7倍以上速いという結果になりました・・・。 > ここの速度が同程度まで出ればベストなんですが。 そうですね! MyISAMでどうやっているかを見ればmroongaでもできそうか検討で きると思うので、まずは、MyISAMでどうやっているかを確認します! > 他の方のベンチマークも見てみたいですね。 MyISAMではなく、InnoDBですが、こんなベンチマーク結果がありま す。 MySQL-5.6.4からの新機能「InnoDB FTS」を用いた全文検索エンジ ンのベンチマークLTをしました。#mysqlcasual http://y-ken.hatenablog.com/entry/mysql-casual-talks-vol4-innodb-fts これは、ベンチマーク用のデータやプログラムも公開されているの で手元でも試してみたら、たしかにInnoDBの方が速かったです。 ただ、 https://github.com/y-ken/mysql_casual_talks_vol4/blob/gh-pages/benchmark_select.rb#L26 のSELECTにLIMIT 0をつけると同じくらいの速さになるので、検索 パフォーマンスは同じくらいといえると思います。mroongaはレコー ドの読み込みのところが甘いんだろうなぁと思っています。LIMIT を指定されたときにMyISAMほど速くならない点も含めて。 実際にベンチマークをして、結果と傾向を教えてもらえて助かりま した。ありがとうございます! -- 須藤 功平 <kou****@clear*****> 株式会社クリアコード <http://www.clear-code.com/> (03-6231-7270) groongaサポート: http://groonga.org/ja/support/ パッチ採用はじめました: http://www.clear-code.com/recruitment/ コミットへのコメントサービスはじめました: http://www.clear-code.com/services/commit-comment.html