Kouhei Sutou
kou****@clear*****
2013年 8月 28日 (水) 11:04:07 JST
須藤です。 In <CANM+HhdpkhW8WttYWx5xAhgK+jCBigqnmzCSRFetevsa_k8ugA****@mail*****> "[groonga-dev,01706] Re: mroongaの全文検索がうまくできません" on Tue, 27 Aug 2013 20:01:06 +0900, Naoya Murakami <visio****@gmail*****> wrote: >>count(*)にすると↑ >>の最適化が効いてさらに速くなると思います。 >>(なるといいな。。。) > > あれ?match ... against and col = のケースでも、カウント最適化動くんですか? > > この場合、MySQL的には、フルテキストインデックスしか使われず、 > 残りのAND条件がインデックスアクセスできず、カウント最適化は > 動かないものと思っていました。 > order by limitの最適化と同じように、intとvarcharのequalは最適化される? あ、すみません。。。おっしゃるとおりです。 ORDER BY LIMITの最適化と勘違いしていました。。。 > と、いうわけで、若干しつこくなっちゃいますが、追試しました。 ありがとうございます! > そういえば、前は後ろで300Gぐらいのファイルを解凍しており、 > 結構ioが奪われていたかもしれず、 > 今回の追試結果は、前より全体的にはやくなっています。 > よって、最適化有無の速度差が見えにくいです。というか見えません。。 たしかに、そうですね。。。 MySQLのクエリキャッシュが効いているわけでもないですよね。 http://dev.mysql.com/doc/refman/5.1/ja/query-cache.html デフォルトではクエリキャッシュが有効で、SELECT SQL_NO_CACHE ...;とすると明示的にキャッシュを無効にできるみたいです。 http://dev.mysql.com/doc/refman/5.1/ja/query-cache-in-select.html > 手持ちの非常にでかいデータベースのインデックス構築ができたら(できたらいいな)、 > order by limitの最適化も含めて、また検証してみたいと思っています。 おぉ。ありがとうございます! > 以下は、追試結果です。 > > ---------------------------------------- > mysql5.6.13 クエリキャッシュ無効 > > mysql> select count(guid) from CombinedData where match(content) > against('事件' IN BOOLEAN MODE); > +-------------+ > | count(guid) | > +-------------+ > | 89072 | > +-------------+ > 1 row in set (0.03 sec) > > mysql> SHOW STATUS LIKE 'Mroonga_count_skip'; > +--------------------+-------+ > | Variable_name | Value | > +--------------------+-------+ > | Mroonga_count_skip | 0 | > +--------------------+-------+ > 1 row in set (0.00 sec) > > たしかに、このケースでは、カウント最適化うごかなかったのですね。 > 失礼しました。 > > mysql> select count(*) from CombinedData where match(content) against('事件' > IN BOOLEAN MODE); > +----------+ > | count(*) | > +----------+ > | 89072 | > +----------+ > 1 row in set (0.02 sec) > > mysql> SHOW STATUS LIKE 'Mroonga_count_skip'; > +--------------------+-------+ > | Variable_name | Value | > +--------------------+-------+ > | Mroonga_count_skip | 1 | > +--------------------+-------+ > 1 row in set (0.00 sec) > > 最適化できています。が、もとからはやいからほとんどかわりません! > > mysql> select count(guid) from CombinedData where match(content) > against('事件' IN BOOLEAN MODE) and orgId='ee15e1b414ad4329b7d14c857bc91644' > and objId='e9823fae423b4b56859ba98cb8a3a8dc'; > +-------------+ > | count(guid) | > +-------------+ > | 172 | > +-------------+ > 1 row in set (0.40 sec) > > mysql> SHOW STATUS LIKE 'Mroonga_count_skip'; > +--------------------+-------+ > | Variable_name | Value | > +--------------------+-------+ > | Mroonga_count_skip | 0 | > +--------------------+-------+ > 1 row in set (0.00 sec) > > mysql> select count(*) from CombinedData where match(content) against('事件' > IN BOOLEAN MODE) and orgId='ee15e1b > 414ad4329b7d14c857bc91644' and objId='e9823fae423b4b56859ba98cb8a3a8dc'; > +----------+ > | count(*) | > +----------+ > | 172 | > +----------+ > 1 row in set (0.33 sec) > > mysql> SHOW STATUS LIKE 'Mroonga_count_skip'; > +--------------------+-------+ > | Variable_name | Value | > +--------------------+-------+ > | Mroonga_count_skip | 0 | > +--------------------+-------+ > 1 row in set (0.00 sec) > > 若干はやくなっていますが、誤差のようなもので、カウントスキップも > インクリメントされず、カウント最適化は動いてないように見えます。 > > mysql> select count(guid) from CombinedData where match(content) > against('事件 + orgId:ee15e1b414ad4329b7d14c857bc91644 + > objId:e9823fae423b4b56859ba98cb8a3a8dc' IN BOOLEAN MODE) ; > +-------------+ > | count(guid) | > +-------------+ > | 172 | > +-------------+ > 1 row in set (0.06 sec) > > mysql> SHOW STATUS LIKE 'Mroonga_count_skip'; > +--------------------+-------+ > | Variable_name | Value | > +--------------------+-------+ > | Mroonga_count_skip | 0 | > +--------------------+-------+ > 1 row in set (0.00 sec) > > mysql> select count(*) from CombinedData where match(content) against('事件 + > orgId:ee15e1b414ad4329b7d14c857bc91 > 644 + objId:e9823fae423b4b56859ba98cb8a3a8dc' IN BOOLEAN MODE) ; > +----------+ > | count(*) | > +----------+ > | 172 | > +----------+ > 1 row in set (0.06 sec) > > mysql> SHOW STATUS LIKE 'Mroonga_count_skip'; > +--------------------+-------+ > | Variable_name | Value | > +--------------------+-------+ > | Mroonga_count_skip | 1 | > +--------------------+-------+ > 1 row in set (0.00 sec) > > againstの中でgroongaのクエリ構文指定する方法でもカウント最適化がうごきました! > が、やはり、最適化うごいていない場合もほとんど限界まではやくて差が見えないように思えます。 > もっとデータを大きいのにすれば、このケースはさらにはやくなるのかもしれませんね。