[groonga-dev,00603] Re: LIMIT使用時の異常について

Back to archive index

Kouhei Sutou kou****@clear*****
2011年 11月 9日 (水) 10:26:21 JST


須藤です。

In <CAKRt****@mail*****>
  "[groonga-dev,00601] LIMIT使用時の異常について" on Tue, 8 Nov 2011 13:38:49 +0900,
  Horikoshi Yuki <horik****@gmail*****> wrote:

> 以下の環境にてLIMITを使ったクエリにおいて
> 結果がズレてしまう(?)現象がありましたので報告します。

ありがとうございます!

> mysql> SELECT * FROM test_table WHERE MATCH(word) AGAINST ('あ') ORDER
> BY year LIMIT 0,10;
> +----+-----------------+------+
> | id | word            | year |
> +----+-----------------+------+
> |  7 | あお            | 1966 |
> |  7 | あお            | 1966 |  ← id 7が重複
> |  6 | あいうえお      | 1976 | ←id 5が除外
> |  1 | あ              | 1980 |
> |  2 | あい            | 1981 |
> |  3 | あいう          | 1982 |
> +----+-----------------+------+
> 6 rows in set (0.01 sec)

こちらでも再現しました!調べてみますね。
再現手順が揃っていてとても助かります。

少しいじってみた感じだとスキーマの

>   key(year)

を消したら問題が起きなくなったのでインデックスを使ったソート
まわりが怪しいかなぁと思っています。

> また、関連があるかわかりませんが
> SQL_CALC_FOUND_ROWSを使った際も結果値が期待値と異なります。
> 
> 正常)
> mysql> SELECT SQL_CALC_FOUND_ROWS * FROM test_table WHERE MATCH(word)
> AGAINST ('あ') ORDER BY year;
> 〜中略〜
> mysql> SELECT FOUND_ROWS();
> →6
> 
> 異常)
> mysql> SELECT SQL_CALC_FOUND_ROWS * FROM test_table WHERE MATCH(word)
> AGAINST ('あ') ORDER BY year LIMIT 5;
> 〜中略〜
> mysql> SELECT FOUND_ROWS();
> →5

これは、最適化の影響がしますね。。。

groongaストレージエンジンでは

  http://mroonga.github.com/ja/docs/userguide/storage.html#optimisation-for-order-by-limit-in-full-text-search

というような最適化をしているのですが、これを実現するために
MySQLサーバーにはヒットした全レコード数ではなくてLIMIT後のレ
コードしか返さないようになっていた気がします。そのため、
FOUND_ROWS()の結果がLIMITと同じになっている気がします。

これも見てみます。

-- 
須藤 功平 <kou****@clear*****>
株式会社クリアコード <http://www.clear-code.com/> (03-6231-7270)




groonga-dev メーリングリストの案内
Back to archive index