原因不明のInnoDBタイムアウト


10

最近、いくつかの非常に基本的な更新がタイムアウトし、原因を特定できませんでした。例:

//#Query_time:51 Lock_time:0 Rows_sent:0 Rows_examined:0

UPDATE photos SET position = position + 1 WHERE (photo_album_id = 40470);

同じログには、Lock_time> 0のエントリはありshow innodb statusません。実行しても、関連するロックは明らかになりません。この問題は、私のアプリケーションサーバーログ(Mysql::Error: Lock wait timeout exceededmysql-slowログの対応する各エントリに関連するエラーを示す)に基づいて、少なくとも5つの異なるテーブルに影響しているようです。

ここからどこへ行くべきかについてのアイデアはありますか?私はあらゆる方向に行き止まりを打っています。ありがとう。

編集:

CREATE TABLE `写真`(
  `id` int(11)NOT NULL auto_increment、
  `type` varchar(255)NOT NULL、
  `photo_album_id` int(11)NOT NULL、
  `user_id` int(11)NOT NULL、
  `title` varchar(255)default 'Untitled'、
  「説明」テキスト、
  `credit` varchar(255)デフォルトはNULL、
  `photo_file_name` varchar(255)デフォルトはNULL、
  `photo_content_type` varchar(255)デフォルトはNULL、
  `photo_file_size` int(11)デフォルトはNULL、
  `photo_updated_at`日時デフォルトNULL、
  `position` int(11)デフォルトは '0'、
  `views` int(11)デフォルトは '0'、
  `folder` varchar(255)デフォルトはNULL、
  `published` tinyint(1)デフォルトは '0'、
  `published_at`日時デフォルトNULL
  `created_at` datetime default NULL、
  `updated_at`日時デフォルトNULL、
  `album_published` tinyint(1)デフォルトは '0'、
  `comment_count` int(11)デフォルトは '0'、
  `audio_file_name` varchar(255)デフォルトはNULL、
  `audio_content_type` varchar(255)デフォルトはNULL、
  `audio_file_size` int(11)デフォルトはNULL、
  `audio_updated_at`日時デフォルトNULL、
  `cover` tinyint(1)デフォルトは '0'、
  `slug` varchar(255)デフォルトはNULL、
  `comments_count` int(11)デフォルトは '0'、
  `delete_from_s3` tinyint(1)デフォルトは '0'、
  `batch` int(11)デフォルトはNULL、
  `audio` varchar(255)デフォルトはNULL、
  PRIMARY KEY( `id`)、
  KEY `index_photos_on_album_published`(` album_published`)、
  KEY `index_photos_on_batch`(` batch`)、
  KEY `index_photos_on_comment_count`(` comment_count`)、
  KEY `index_photos_on_created_at`(` created_at`)、
  KEY `index_photos_on_delete_from_s3`(` delete_from_s3`)、
  KEY `index_photos_on_photo_album_id`(` photo_album_id`)、
  KEY `index_photos_on_published`(` published`)、
  KEY `index_photos_on_published_at`(` published_at`)、
  KEY `index_photos_on_type`(` type`)、
  KEY `index_photos_on_user_id`(` user_id`)
)ENGINE = InnoDB AUTO_INCREMENT = 42830 DEFAULT CHARSET = utf8

愚かな質問:そのテーブルにはどのインデックスがありますか?
Gaius

こんにちは、編集をご覧ください。
mvbl fst

うーん、これはOracleで非常に簡単に診断できるので迷惑です。10046トレースレベル12を設定するだけで、何が行われているのか正確にわかります。それについてもう少し考えてみます。
Gaius

InnoDBテーブルでも同様の問題が発生しています。増分と関係があると思います。私がやっていること:UPDATE table SET <field>=<field>+1 WHERE <pk_field>=1;私のテーブルはもっとシンプルです。ランダムにこれが発生している同じエラーが発生します。私のバージョンは5.1.39です。今日はそれを理解するために少し時間を費やしているので、何か見つけたら更新します。

ありがとう、plsはあなたが見つけたものを私に知らせます、私たちはまだこれを理解していません。
mvbl fst

回答:


3

これは本当に遅いのですが、SHOW ENGINE INNODB STATUSの出力をキャプチャする必要があります。そのクエリの実行中に、それが待機している理由を確認します。

特定の時間帯に頻繁に発生する場合は、x秒ごとにその出力を取得し、それをキャプチャする(または、人為的に負荷を生成する)ことは簡単です。


0

私はデータベースを正規化すると言います-そして適切なインデックスを追加します。

単一の写真は、それが属するアルバムに関するすべての情報を運ぶ必要はありません-これはアルバムの個別のテーブルを要求します-そして、写真IDのマッピングのみを含む関係テーブル(個別のテーブルと、photoIDとphotographerIDの間のマッピングテーブル

最初はクエリが少し複雑になるかもしれませんが、情報が論理的に分割され、同時にRDBMSを使用してデータとその関係について調べます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.