Kouhei Sutou
kou****@clear*****
2013年 2月 9日 (土) 12:09:39 JST
須藤です。 In <CAGyvMCRVHxJ6uj8MmjF4V1HYiPtCkKT2_FyTqe****@mail*****> "[groonga-dev,01194] Re: mroongaストレージモード、マルチインデックスでの絞り込み不具合" on Fri, 8 Feb 2013 17:24:24 +0900, b senboku <senbo****@gmail*****> wrote: >> 手元にあったMySQL 5.5.28で試してみたら再現しました! >> 再現SQLがあってとても助かります。ありがとうございます。 > > > まずは再現可能ということでホッとしております。 修正しました! groongaの方の問題でした。 groongaがmroonga用に提供している機能があるのですが、そこに問 題がありました。なので、groonga単独で使っている場合は問題が ないのですが、mroongaから使っていると問題に遭遇することがあ りました。 で、ストレージモードだけで起こりえるのかラッパーモードでも起 こりえるのかですが、ストレージモードだけでしか起こりえません。 あと、インデックスはマルチカラムインデックスかどうか関係なく 起こりえます。 再現コードを小さくして自動でテストできるようにしたものをコミッ トしてあります。 https://github.com/mroonga/mroonga/commit/d77dc9514aabb43fe7542206021971ca71f2874a ふつうのインデックスならこれで再現します。 SET NAMES utf8; CREATE TABLE scores ( value INT, INDEX (value) ); INSERT INTO scores VALUES (21); INSERT INTO scores VALUES (21); INSERT INTO scores VALUES (22); SELECT count(*) FROM scores WHERE value >= 20; UPDATE scores SET value = 11 WHERE value = 21; SELECT count(*) FROM scores WHERE value >= 20; マルチカラムインデックスならこれで再現します。 CREATE TABLE scores ( deleted BOOLEAN, value INT, INDEX (deleted, value) ); INSERT INTO scores VALUES (FALSE, 1); INSERT INTO scores VALUES (FALSE, 1); INSERT INTO scores VALUES (FALSE, 2); SELECT count(*) FROM scores WHERE deleted = FALSE; UPDATE scores SET deleted = TRUE WHERE value = 1; SELECT count(*) FROM scores WHERE deleted = FALSE; ただ、いつでも発生するわけではなく、インデックスの最初の方の 値が同じで、その値が別の値に変更された場合に発生しやすくなり ます。例えば、21と22だと10の位の2が同じですが、これが別の値 に変更されると発生しやすいです。マルチカラムインデックスの場 合でも最初のカラムの最初の方の値が影響しやすいです。 で、この修正がいつ反映されるかなんですが、今日のリリースには 間に合わなくて、今月末のリリースに反映される予定です。 時間があってすみません。。。 ちなみに、groonga側の修正は↓の3行です。 https://github.com/groonga/groonga/commit/60a00564d2e9b99c898a25e4ecb3f5c43fb8cf97 -- 須藤 功平 <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