私は非常に簡単なクエリを持っています。は、ほとんどの場合で、他のまれなケースでは最大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警告:0MySQLの> 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警告:0MySQLの> 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警告:0MySQLの> 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(matchNo
、memberNo
)、
KEYstatus
(status
)、
KEYFK_matchSessionMembers_memberNo
(memberNo
)、
KEYregDatetime
(regDatetime
)、
KEYFK_matchSessionMembers_matchNo
(matchNo
)、
CONSTRAINTFK_matchSessionMembers_matchNo
FOREIGN KEY(matchNo
)matchSessions
(matchNo
)を参照し、
CONSTRAINTFK_matchSessionMembers_memberNo
FOREIGN KEY(memberNo
)members
(memberNo
)
を参照)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
)、
KEYstatus
(status
)、
KEYactiveDate
(activeDate
)、
KEYexpireDate
(expireDate
)
)ENGINE = InnoDBのAUTO_INCREMENT = 113912デフォルトの文字セット= utf8を
何行目について話していますか?私はこれらの2つのテーブルの行のおよその数を意味します。 –
'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'; 'と報告して戻ってきます。 –
ひどい金額ではありません。 matchSessionsが約110k、matchSessionMembersが約220kです。 –