2012-01-27 12 views
0

私は非常に簡単なクエリを持っています。は、ほとんどの場合で、他のまれなケースでは最大30秒かかっています。私はそれを引き起こしているものについて何の手がかりも持っていません。ここで私が話していることの例です。MySQL innoDB(無名)の更新が遅い

MySQLの> UPDATEのmatchSessionMembersのMSMは msm.matchNo = ms.matchNoとms.STATUS ON matchSessionsミリ秒を登録しよう!= 'N' SET msm.STATUS = 'P' msm.memberNo = 7、MSM。 STATUS = 'M';
マッチしたクエリの影響を受けるOK、0行(0.00秒)
行:0変更:0警告:0

MySQLの> UPDATEのmatchSessionMembersのMSMは msm.matchNo = ms.matchNoとms.STATUS ON matchSessionsミリ秒を登録しよう! = 'N' SET msm.STATUS = 'P' WHERE msm.memberNo = 7 AND msm.STATUS = 'M';
クエリマッチした影響を受けOK、0行(0.00秒)
行:0変更:0警告:0

MySQLの> UPDATEのmatchSessionMembersのMSMはmsm.matchNo = ms.matchNoとms.STATUS ON matchSessionsミリ秒を登録しよう! = 'N' SET msm.STATUS = 'P' WHERE msm.memberNo = 7 AND msm.STATUS = 'M';
クエリOK、0行が一致(3.01秒)
行影響: msm.matchNo = ms.matchNoおよびMS ON matchSessionsのMSをJOIN 0

のMySQL> UPDATEのmatchSessionMembersのMSM:0変更:0警告.STATUS!= 'N' SET msm.STATUS = 'P' WHERE msm.memberNo = 7 AND msm.STATUS = 'M';
クエリマッチした影響を受けOK、0行(0.00秒)
行:0変更:0警告:0

MySQLの> UPDATEのmatchSessionMembersのMSMはmsm.matchNo = ms.matchNoとms.STATUS ON matchSessionsミリ秒を登録しよう! = 'N' SET msm.STATUS = 'P' WHERE msm.memberNo = 7 AND msm.STATUS = 'M';
クエリOK、0行が一致(1.88秒)
行影響: msm.matchNo = ms.matchNoおよびMS ON matchSessionsのMSをJOIN 0

のMySQL> UPDATEのmatchSessionMembersのMSM:0変更:0警告.STATUS!= 'N' SET msm.STATUS = 'P' WHERE msm.memberNo = 7 AND msm.STATUS = 'M';
クエリOK、マッチした影響を受けた0行(0.00秒)
行:0変更:0警告:私はすべてのmsm.matchNo、ms.matchNo、ms.statusのインデックスを設定している。このクエリで0

、msm.status、およびmsm.memberNo。

同じクエリを6回実行し、クエリが1秒以内に終了した4件、2件が処理に1秒以上かかりました。私はもう少しテストを行い、この愚かなクエリを実行するのに30秒かかったより重大なケースの1つについてプロファイルデータを得ました。

mysql> SHOW PROFILE FOR QUERY 3; 
+---------------------------+-----------+ 
| Status     | Duration | 
+---------------------------+-----------+ 
| starting     | 0.000075 | 
| checking permissions  | 0.000013 | 
| checking permissions  | 0.000012 | 
| Opening tables   | 0.000073 | 
| checking permissions  | 0.000011 | 
| checking permissions  | 0.000013 | 
| System lock    | 0.000023 | 
| init      | 0.000021 | 
| updating main table  | 0.000014 | 
| optimizing    | 0.000020 | 
| statistics    | 0.000117 | 
| preparing     | 0.000028 | 
| executing     | 0.000011 | 
| Sending data    | 31.940094 | <== 
| updating reference tables | 0.000039 | 
| end      | 0.000016 | 
| end      | 0.000015 | 
| query end     | 0.000048 | 
| closing tables   | 0.000039 | 
| freeing items    | 0.000036 | 
| logging slow query  | 0.000011 | 
| cleaning up    | 0.000014 | 
+---------------------------+-----------+ 

他にも同様の症状のUPDATEクエリがあります。実際に更新されている行がなくても、実行に時間がかかるのはなぜですか?この "送信データ"のボトルネックはどうなるでしょうか?

**編集:追加されたテーブルmatchSessionMembers
matchNo INT(11)NOT NULL、
memberNo INT(11)NOT NULL、
statusをCREATE

を使用している両方の表の表のコードを作成CHAR(1)NOT NULL DEFAULT 'M' COMMENT 'M =試合、ペンディングP =、Y = saidYes、N = saidNo、D =削除'、
muted CHAR(1)NOT NULL DEFAULT 'N'、
deleted CHAR(1)NOT NULL DEFAULT 'N'、
regDatetime日時のデフォルトNULL、
exitDatetime日時のデフォルトNULL、
PRIMARY KEY(matchNomemberNo)、
KEY statusstatus)、
KEY FK_matchSessionMembers_memberNomemberNo )、
KEY regDatetimeregDatetime)、
KEY FK_matchSessionMembers_matchNomatchNo)、
CONSTRAINT FK_matchSessionMembers_matchNo FOREIGN KEY(matchNomatchSessionsmatchNo)を参照し、
CONSTRAINT FK_matchSessionMembers_memberNo FOREIGN KEY(memberNomembersmemberNo
を参照)ENGINE = InnoDBのデフォルトの文字セット= UTF8

を表matchSessions
matchNo INTを作成する(11 )NOT NULL AUTO_INCREMENT、
memberCount int(11)NOT NULL、
status char(1)NOT NULL DEFAULT 'P' COMMENT 'P =ペンディング、Y =成功、 N =失敗し、X =期限切れの」、
isQuickMatch CHAR(1)NOT NULL DEFAULT 'N'、
open CHAR(1)NOT NULL DEFAULT 'N'、
regDatetime日時のDEFAULT NULL、
activeDate日付DEFAULTのNULL 、
expireDate日付のデフォルトNULL、
PRIMARY KEY(matchNo)、
KEY statusstatus)、
KEY activeDateactiveDate)、
KEY expireDateexpireDate
)ENGINE = InnoDBのAUTO_INCREMENT = 113912デフォルトの文字セット= utf8を

+0

何行目について話していますか?私はこれらの2つのテーブルの行のおよその数を意味します。 –

+1

'UPDATE matchSessionMembers msm JOIN matchSessions ms ON msm.matchNo = ms.matchNo SET msm.STATUS = 'P' WHERE msm.memberNo = 7 AND msm.STATUS = 'M' AND ms.STATUS!= 'N'; 'と報告して戻ってきます。 –

+0

ひどい金額ではありません。 matchSessionsが約11​​0k、matchSessionMembersが約220kです。 –

答えて

1

私はそれを考え出しました。

私の愚かなミス。しかし、それを識別することは容易ではなかった。 私は30秒以上実行されていた1つの更新クエリを毎時実行する別の超低速クエリを持っていました。私は完全にはわかりませんが、私はそのクエリがすべてをロックし、他のすべてのクエリをキューに入れる必要があると思います。

この1つのダムクエリに起因する他のすべての低速クエリの下に埋め込まれていたため、低速クエリログには気付かなかった。

これは他の誰かが同様の問題を抱えているのを助けてくれることを願っています。

関連する問題