[groonga-dev,01718] Re: FW: mroonga適用テーブルへの「WHERE IN 多数」クエリでエラー

Back to archive index

Kouhei Sutou kou****@clear*****
2013年 8月 29日 (木) 11:04:24 JST


須藤です。

In <BAY17****@phx*****>
  "[groonga-dev,01715] FW: mroonga適用テーブルへの「WHERE IN 多数」クエリでエラー" on Thu, 29 Aug 2013 03:16:48 +0900,
  K A <a_kira1****@hotma*****> wrote:

> 未解決ですが経過報告させていただきます。

ありがとうございます。

> いただいたアドバイスを参考に、毎分cronによるチェックを走らせることを軸に検証を続けていますが、今のところはかばかしくありません。

そうですか。。。

> productsテーブルは、当初の構造から無関係なインデックスのみ消して、
> 
> CREATE TABLE IF NOT EXISTS `products` (
>   `id` int(11) NOT NULL AUTO_INCREMENT,
>   `vendor_id` int(11) DEFAULT NULL,
>   `entity_id` int(11) DEFAULT NULL,
>   `title` varchar(255) NOT NULL,
>   `description` text NOT NULL,
>   `code` varchar(255) DEFAULT NULL,
>   `code_sub` varchar(255) DEFAULT NULL,
>   `released` date DEFAULT NULL,
>   `minutes` int(11) DEFAULT NULL,
>   `movie` smallint(6) NOT NULL,
>   `large_pic` smallint(6) NOT NULL,
>   `tag_pool` text NOT NULL,
>   `count` int(11) NOT NULL,
>   `bookmark_count` int(11) NOT NULL,
>   `created` datetime DEFAULT NULL,
>   `modified` datetime DEFAULT NULL,
>   PRIMARY KEY (`id`),
>   UNIQUE KEY `code_vendor_id` (`code`,`vendor_id`),
>   FULLTEXT KEY `ft_all` (`title`,`description`,`code`,`code_sub`,`tag_pool`) COMMENT 'normalizer "NormalizerAuto"'
> ) ENGINE=mroonga  DEFAULT CHARSET=utf8 COMMENT='engine "innodb"';
> 
> となっています。

情報ありがとうございます。こちらで検証するときに助かると思い
ます。

> 現時点でほぼ確実と思われるのは以下のような点です。
> 
> まず、「WHERE `検索条件フィールド` IN (多数)」形式のクエリの「検索条件フィールド」がproducts.code以外の場合、「Got error 1 when reading table」エラーは発生しないようです。
> この点は、上記チェック用シェルの検索対象フィールドを同テーブルのidもしくはcode_subフィールドに変更して毎分実行しても、一向にエラーが発生しないことから判断しました。
> 
> また、エラーが起きるのはproductsテーブルに「code_vendor_id」ユニークインデックスと「ft_all」全文インデックスが両方ともある場合だけのようです。
> いずれか片方しかない場合に「Got error 1 when reading table」エラーが確認された例は今のところありません。
> しかし、この2つのインデックスを消して張り直してもエラーは再発します。

おぉ、これは有力な情報ですね!
INはインデックスがあればそれを使って絞り込んでいるはずなので、
たしかに関係がありそうです。

> あと、それとは別に一つ気になる点があります。
> サイトへの外部からのブラウザアクセスを遮断(アクセスがあった場合は静的なメインテナンスページを表示)してDBインポートを行った場合、アクセスを遮断したままの状態では、記憶にある限りまだ1度もエラーが起きたことがない、という点です。

これも気になりますね。

> そのことから、あるいは複数のクエリを同時的にさばこうとした際になんらかの問題が起きている可能性はないんだろうか、という疑念もあります(「それはありえない」という場合は教えていただけると助かります)。

うーん、これはまだなんともいえない感じです。

> 実働データを利用した実験には限界を感じ始めたので、明日からはトラブルの再現が可能なデータ作りに挑戦してみようかと思っています。

そっちの方が現実的だと思います。ただ、それでも結構な手間だと
思うので、無理しない程度でご協力してもらえればこちらはそれで
十分です。参考までに、こうしたらいいんじゃないかなぁというの
を書いておきます。

参考:

環境は以下の通り。

  * MySQL: 5.6.12
  * OS: CentOS 6
  * mroonga: 3.06(wingさんのところのやつ)

テーブルをこのくらい小さくして

CREATE TABLE IF NOT EXISTS `products` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `vendor_id` int(11) DEFAULT NULL,
  `title` varchar(255) NOT NULL,
  `description` text NOT NULL,
  `code` varchar(255) DEFAULT NULL,
  `code_sub` varchar(255) DEFAULT NULL,
  `tag_pool` text NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `code_vendor_id` (`code`,`vendor_id`),
  FULLTEXT KEY `ft_all` (`title`,`description`,`code`,`code_sub`,`tag_pool`) COMMENT 'normalizer "NormalizerAuto"'
) ENGINE=mroonga  DEFAULT CHARSET=utf8 COMMENT='engine "innodb"';

以下の操作をずっとし続けて問題が発生するかを確認するのがよい
と思います。

  * データを投入し続ける
  * SELECT WHERE INを実行し続ける

もし、再現したらft_allに入れているカラムを1つずつ減らしていっ
てください。例えば、titleを減らしてこんな感じです。

CREATE TABLE IF NOT EXISTS `products` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `vendor_id` int(11) DEFAULT NULL,
  `description` text NOT NULL,
  `code` varchar(255) DEFAULT NULL,
  `code_sub` varchar(255) DEFAULT NULL,
  `tag_pool` text NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `code_vendor_id` (`code`,`vendor_id`),
  FULLTEXT KEY `ft_all` (`description`,`code`,`code_sub`,`tag_pool`) COMMENT 'normalizer "NormalizerAuto"'
) ENGINE=mroonga  DEFAULT CHARSET=utf8 COMMENT='engine "innodb"';

減らしても問題が発生したらそのカラムは関係ないことがわかりま
す。続いて他のカラムも減らしてください。

ft_allは↓のようにcodeだけになるくらいまで減らせるんじゃない
かと思います。

CREATE TABLE IF NOT EXISTS `products` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `vendor_id` int(11) DEFAULT NULL,
  `code` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `code_vendor_id` (`code`,`vendor_id`),
  FULLTEXT KEY `ft_all` (`code`) COMMENT 'normalizer "NormalizerAuto"'
) ENGINE=mroonga  DEFAULT CHARSET=utf8 COMMENT='engine "innodb"';

これでもまだ発生するようならvendor_idも減らしてください。

CREATE TABLE IF NOT EXISTS `products` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `code` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `code_vendor_id` (`code`),
  FULLTEXT KEY `ft_all` (`code`) COMMENT 'normalizer "NormalizerAuto"'
) ENGINE=mroonga  DEFAULT CHARSET=utf8 COMMENT='engine "innodb"';

ここまで減らせたらなら再現手順が確立できていると思うのでそれ
を教えてもらって、こちらでも再現できれば直せると思います。

もし、ここまでいく前に問題が発生しなくなったらそのカラムが原
因に関係しています。その状態でも再現手順は確立できている気が
するのでそれを教えてもらえるとうれしいです。

> また末尾に、トラブル再発直前の1分間のクエリログ(一例)をコピー&ペーストしておきます。
> 一部名詞のみ、公人のお名前などで置き換えていますが、ほかは概ねログのままです。

ありがとうございます!
productsの中で更新しているのはcountだけなんですね。codeも変
更しているかと思ったのですが。。。何が影響しているのかしら。

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