[groonga-dev,02077] Re: ストレージモードで転置索引テーブルからレコードを削除するとデータも削除される

Back to archive index

Kouhei Sutou kou****@clear*****
2014年 1月 28日 (火) 16:56:22 JST


須藤です。

In <CAHB5oTOKg_noT7sK3B=9N3++Pde15cp0ZwCUd=ghX=ocdDY****@mail*****>
  "[groonga-dev,02073] ストレージモードで転置索引テーブルからレコードを削除するとデータも削除される" on Mon, 27 Jan 2014 10:44:35 +0900,
  "yoku ts." <yoku0****@gmail*****> wrote:

> 作業のログはこんな感じになるのですが、
> 
> https://gist.github.com/yoku0825/3a0f5adeba0be3aeb32f
> 
> ・WHERE MATCH(val) AGAINST ('まご' IN BOOLEAN MODE)でnum= 1が引っかからないようにしたい
> ・でもWHERE num= 1では当然引っかかってほしい(データはそのまま残る)
> ・t1-valの_key== 'まご'を消せばいけるはず
> 
> と思っていたのですが、カスケード削除に当たるのか、
> t1テーブルのvalカラムがまるまる空っぽになってしまっています。

これは期待していない挙動です!

Groongaにはカスケード削除機能があって、これはインデックスのキー
を消すと、インデックス元のレコード消す機能です。もともと、こ
の機能は、全文検索用のインデックスではなく、逆引き用のインデッ
クスのために追加したものです。

追加コミットがこれで、このコミットに含まれているテストがユー
スケースを表しています。
  https://github.com/groonga/groonga/commit/d488768d3eca23aadd1a429528a4054a1dcc53e3

ユーザーがブックマークするみたいなサービス用のケースで、URL
が消えたらユーザーのブックマークからも削除する、ということを
実現したいケースです。URLだけ消すと、ユーザーのブックマーク
にすでに存在しないURLテーブルのレコードへの参照が残ってしま
うので、いろいろ不具合があったのです。それが起きないようにカ
スケード削除機能を追加しました。

  ユーザーテーブル
    ブックマークカラム(URLテーブル型。ベクター。)

  URLテーブル
    ユーザーテーブルのブックマークカラム用のインデックス(*)

(*) URLを指定してブックマークしているユーザー一覧を高速に検
    索するため。


で!そのときは全文検索用のインデックスのテーブルのキー(トー
クン)を削除することは想定していなかったのです!で、全文検索
用のインデックスで同じような挙動になるのは、変だなぁと思うの
で、期待していない挙動です!

手元ではカスケード削除しないようにする変更があるんですが、今、
コードフリーズ中なので、明日以降にpushしておきます!

> (ストレージモードのみで、ラッパーモードでは期待した結果になりました)

↑のカスケード削除機能はGroongaのデータベース機能のレイヤー
(テーブルとかカラムの関係とかを管理)のAPIで実装しているので
すが、ラッパーモードのときは、それより下のレイヤーのAPIで、イ
ンデックスを直接使っていたので関係無かったのです。

> また、deleteを叩いた直後はMySQLからはdelete前の情報が見えていて、
> FLUSH TABLESなどで開きなおしてやるとdelete後の情報が見えるようになっているようです。

これはMySQLのキャッシュじゃないかと思います。

> また、↑のような「あるレコードが特定のキーワードで(のみ)マッチしないようにする」のはt1-valの_keyをいじってやる…というのはそもそも間違っていたりしますか?

想定はしていませんでしたが、動くといいなとは思いました!

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

Groongaサポート:
  http://groonga.org/ja/support/
パッチ採用はじめました:
  http://www.clear-code.com/recruitment/
コミットへのコメントサービスはじめました:
  http://www.clear-code.com/services/commit-comment.html




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