[groonga-dev,03842] Re: Mroonga で timestamp 型の index が破損するパターンがある(ストレージモード)

Back to archive index

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




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