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

Back to archive index

Kouhei Sutou kou****@cozmi*****
2016年 1月 12日 (火) 15:50:30 JST


須藤です。

In <20160****@domai*****>
  "[groonga-dev,03847] Re: Mroonga で timestamp 型の index が破損するパターンがある(ストレージモード)" on Tue, 12 Jan 2016 15:01:28 +0900,
  各務 洋 <kagam****@outwa*****> wrote:

>> 手元でも再現したので直しました!
> 
> ありがとうございます!やっふ〜!

シェルスクリプトを直してもらえたので助かりました。
シェルスクリプトで再現できるようにする、というのは再現する確
率が高くなってよさそうな気がしました。

>> 各務さんはmysql-community-mroongaのCentOS 6 x86_64でしたよね。
> 
> もし可能でしたら、今回は
> 
>> 環境:
>> CentOS   7.1
>> MySQL  5.7.9
> 
> の環境分もいただけますと助かります。

すみませんでした。。。
ビルドしました!

  http://packages.groonga.org/tmp/mysql57-community-mroonga-5.12-1.el7.centos.x86_64.rpm

>> 「(ちょっと調べた中では0件だけど)
>> 1件ヒットしそう」と返すことにしました。
> 
> なるほど。対象行数の概算見積が 0 件の時に発生するという認識でよろしい
> でしょうか?

はい、そうです。

> 修正以前の場合でも、テーブルに更新が入ると概算見積も変わるのが期待され
> る挙動だと思うのですが、一度のこの状態になると INSERT / DELETE で変わ
> らなくなっていたように見受けられる点がちょっと気になりました。

それは、レコードを削除してもインデックスのキーは消えないから
なんです。インデックスのキーとはデータが
「2016-01-12 00:00:00」ならそれと同じ「2016-01-12 00:00:00」
です。

クエリーが

  time_column >= '2016-01-12 00:00:00'

だとするとインデックスのキーを昇順に並べて「2016-01-12 00:00:00」
を含めて1000件のインデックスのキーを使って概算見積をします。

「2016-01-12 00:00:00」の「データ」を消すと
「2016-01-12 00:00:00」の「インデックスのキー」には何もデー
タが紐付いていないので「2016-01-12 00:00:00」の
「インデックスのキー」に対する概算見積は0件になります。

これが1000件続くと全体としても概算見積は0件になります。

なので、データが削除されて「インデックスのキー」に紐付いてい
ないデータが増えれば増えるほど全体として概算見積が0件になる
確率が高くなります。

(絵を描かないと伝わりにくい気がしますが。。。)

>> そのため、ちょっと調べた中にヒットするレコードがなくても、そ
>> れが全部の検索でない場合は「(ちょっと調べた中では0件だけど)
> 
> ふむふむ、これは Unique Index と Index での差は何か出てくる所はある形
> でしょうか?

検索するときはuniqueだろうとそうでなかろうと関係ないので
uniqueなインデックスに対して範囲検索するときも同じことが起こ
りえます。


-- 
須藤 功平 <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