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)