Kouhei Sutou
kou****@clear*****
2012年 2月 1日 (水) 14:31:15 JST
須藤です。 In <20120****@gmail*****> "[groonga-dev,00689] 全文検索カラム以外を含んだ検索について" on Tue, 31 Jan 2012 18:26:06 +0900, Takayuki Honda <honda****@gmail*****> wrote: > Fulltext_index対象以外のカラムを含んだ検索をする場合、 > tritonnですと、2ind index機能を当てにして、 > 下記のようなクエリを実行していました。 > > -------------------------------------------------- > select > * > from > table force index(idx01) > where > match(body) against (“さんぷる”) > and > flag = 1 > --------------------------------------------------- > > mroongaですと、force indexを外して下記のようになると思いますが、 > > --------------------------------------------------- > select > * > from > table > where > match(body) against (“さんぷる”) > and > flag = 1 > --------------------------------------------------- > > この場合の動作は、まず全文検索を実行した後、 > 検索対象の通常カラムのみを読み込んで、対象行を特定するのか、 > はたまた逆なのか、どちらになりますでしょうか。 「まず全文検索を実行した後、検索対象の通常カラムのみを読み込 んで、対象行を特定するのか」になります。 (MySQLのクエリ実行プランを考えているところも関係するので、 全体のレコード数やヒット件数によっては異なるかもしれません。) さて、Tritonnの2ind機能では以下の4種類の問題を解決していまし た。 http://qwik.jp/tritonn/userguide.html#0cb0baa8b27d86e9233f601a9cc9cc4f 1. limit指定で出力を制限しても応答が遅い問題 select columns from table where match(a) against(b) limit 1000, 10 2. count(*)等で件数を取得するだけでも応答が遅い問題 select count(*) from table where match(a) against(b); 3. 全文検索以外の条件で絞り込む処理が遅い問題 select columns from table where match(a) against(b) and c like 'hoge%'; 4. 全文検索以外の条件でソートする処理が遅い問題 select columns from table where match(a) against(b) order by c; 今回のケースは3.にあたるかと思います。 mroongaでは、このうち1.と2.のみを実装していますが、3.と4.は 未実装です。 1.に相当する「全文検索時の ORDER BY LIMIT 高速化」: http://mroonga.github.com/ja/docs/userguide/storage.html#optimisation-for-order-by-limit-in-full-text-search 2.に相当する「行カウント高速化」: http://mroonga.github.com/ja/docs/userguide/storage.html#optimisation-for-counting-rows で、3.についてはcond pushという仕組みで実現できそうなのです が、まだ手を付けられていません。4.についてはまだ検討していま せん。 未着手な改善案がいくつかあるので、要望等に応じて優先順位をつ けて開発していきたいと思っています。 -- 須藤 功平 <kou****@clear*****> 株式会社クリアコード <http://www.clear-code.com/> (03-6231-7270) プログラミングが好きなソフトウェア開発者を募集中: http://www.clear-code.com/recruitment/