Kouhei Sutou
kou****@clear*****
2016年 1月 10日 (日) 17:18:16 JST
須藤です。 In <20160****@domai*****> "[groonga-dev,03836] Re: Mroonga で timestamp 型の index が破損するパターンがある(ストレージモード)" on Wed, 06 Jan 2016 19:19:26 +0900, 各務 洋 <kagam****@outwa*****> wrote: > 頂いたスクリプト(test.sh)ですが、ちょっと順序が違うようでした。 > これで再現しましたが、どうでしょうか? ありがとうございます! 手元でも再現したので直しました! 各務さんはmysql-community-mroongaのCentOS 6 x86_64でしたよね。 ↓にパッケージをおいておきました。 http://packages.groonga.org/tmp/mysql-community-mroonga-5.12-1.el6.x86_64.rpm 5.01(2015年3月29日リリース)の頃にヒットレコード数が増える と範囲検索が遅くなるという問題がありました。 ↓の「mroongaのウォームアップと範囲指定」の件です。 https://osdn.jp/projects/groonga/lists/archive/dev/2015-April/thread.html MySQLは実際に範囲検索する前にMroongaに「どのくらいヒットしそ う?」と聞くんですが、Mroonga 5.01の頃までは正直に「○○件ヒッ トするよ!」と答えていました。当然ヒット件数が増えると時間が かかります。 しかし、MySQLは速い実行計画を決めるために「どのくらいヒット しそう?」と聞いているだけなので、その回答にたくさん時間がか かるのは本末転倒です。そのため、5.02からは「ちょっと調べて ○○件ヒットしそう」と返すことにしました。これならあまり時間 はかかりません。 ただ、ちょっと調べた中にヒットするレコードがない場合は「0件 ヒットしそう」と答えるのが問題になります。この場合、MySQLは 「あ、ヒットしないんだ。じゃあ検索せずに0件ヒットと返すね」 と処理してしまいます。この場合、ちょっと調べた中ではヒットし ないけど、ちゃんと検索するとヒットする場合は異なる結果(ヒッ トしない)になってしまいます。これが、今回のケースです。 そのため、ちょっと調べた中にヒットするレコードがなくても、そ れが全部の検索でない場合は「(ちょっと調べた中では0件だけど) 1件ヒットしそう」と返すことにしました。MySQLは1件あるならちゃ んと検索しようかと考えるので、ちゃんと検索する処理が走って正 しい結果が返ります。 なお、この問題の小さな再現ケースは次のSQLになりました。 (3件登録して1件削除。) https://github.com/mroonga/mroonga/blob/8648af37b2aff4da4bf22afb32bedcab4acce3fd/mysql-test/mroonga/storage/variable/max_n_records_for_estimate/t/not_found_in_limit.test -- 須藤 功平 <kou****@clear*****> 株式会社クリアコード <http://www.clear-code.com/> Groongaベースの全文検索システムを総合サポート: http://groonga.org/ja/support/ パッチ採用 - プログラミングが楽しい人向けの採用プロセス: http://www.clear-code.com/recruitment/ リーダブルコードワークショップ: http://www.clear-code.com/services/code-reader/readable-code-workshop.html