still the trigger problem
Posted by:
h ch
Date: April 07, 2010 03:11AM
first i have two host ,the trigger set in slave (not master)
run show processlist ,i notice that the trigger run very long time
# mysql -e "show processlist"|cat
Id User Host db Command Time State Info
1 system user NULL Connect 7093 Waiting for master to send event NULL
2 ecp 202.107.194.178 server Connect 4637 Sending data Replace INTO \n ServerTrigger.TB_ADVICE_Q(ADV_Id,ADVS_Id,CM_Id,CM_Status,Subscribe_Q_Id) \n
3 ecp 172.16.16.12:4446 ServerTrigger Query 417 Locked SELECT Logon_ID FROM ServerTrigger.TB_LeaveMsg limit 1
6 ecp 202.107.194.184:62188 server Sleep 3 NULL
7 root localhost server Sleep 6306 NULL
105 ecp 202.107.194.184:62376 NULL Sleep 152 NULL
106 ecp 202.107.194.184:62377 NULL Sleep 152 NULL
199 root localhost test Sleep 35 NULL
523 ecp 172.16.16.13:1196 server Sleep 1317 NULL
525 ecp 172.16.16.13:1230 server Query 417 Locked SELECT * FROM ServerTrigger.TB_ADVICE limit 10
526 ecp 172.16.16.13:1233 server Sleep 1268 NULL
527 ecp 172.16.16.13:1236 server Sleep 1268 NULL
528 ecp 172.16.16.13:1239 server Sleep 1268 NULL
529 ecp 172.16.16.13:1242 server Sleep 1268 NULL
530 ecp 172.16.16.13:1246 server Sleep 1268 NULL
531 ecp 172.16.16.13:1249 server Sleep 1267 NULL
532 ecp 172.16.16.13:1252 server Sleep 1267 NULL
533 ecp 172.16.16.13:1255 server Sleep 1267 NULL
and the same time ,i observed the slave SQL thread behind the master so long,so
i judge the trigger blocked the sql thread ,this is the slow replication reason
and here is the trigger code:
Trigger: TRS_AFT_UPD
Event: UPDATE
Table: TB_MStatus
Statement: BEGIN
if OLd.M_Status <> New.M_Status then
Replace INTO
ServerTrigger.TB_ADVICE(ADV_Id,ADVS_Id,CM_Id,CM_Status)
select M_Id,S_Id,New.M_Id as AdvM_Id,New.M_Status as CM_Status from server.TB_MStatus where
M_Id in
(
select userId from server.frirelation where
friendId = New.M_Id and
userid in (select M_Id from server.TB_MStatus where M_Id <> New.M_Id)
);
end if;
if (OLd.M_Status <> New.M_Status) or (Old.SubscribeQ_Id <> New.SubscribeQ_Id) then
Replace INTO
ServerTrigger.TB_ADVICE_Q(ADV_Id,ADVS_Id,CM_Id,CM_Status,Subscribe_Q_Id)
select M_Id,S_Id,New.M_Id as AdvM_Id,New.M_Status as CM_Status,SubscribeQ_Id from server.TB_MStatus where
M_Id in
(select M_Id from server.TB_MStatus as a,
(select asid from `netsun_Q`.`my_Q` where poster =
(select login from `hub_netsun`.`minfo` where id = New.M_Id limit 1))as dummy
where a.SubscribeQ_Id=dummy.asid
);
End If;
END
also the my_Q and the minfo table is very big
mysql> select count(*) from netsun_Q.my_Q;
+----------+
| count(*) |
+----------+
| 13088315 |
+----------+
mysql> select count(*) from hub_netsun.minfo;
+----------+
| count(*) |
+----------+
| 3351717 |
+----------+
*************************** 1. row ***************************
Table: my_Q
Create Table: CREATE TABLE `my_Q` (
`id` int(10) NOT NULL auto_increment,
`asid` int(11) NOT NULL default '0' COMMENT '????id',
`uid` int(11) default NULL,
`poster` varchar(50) collate utf8_unicode_ci default NULL COMMENT '?????',
`post_date` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP COMMENT '????',
`status` tinyint(4) default '0' COMMENT '??????',
`rank` int(11) default '0',
`vip_date` varchar(10) collate utf8_unicode_ci default NULL,
`ecp` tinyint(2) NOT NULL default '0' COMMENT '??????',
PRIMARY KEY (`id`),
UNIQUE KEY `poster1` (`poster`,`asid`),
KEY `asid` (`asid`),
KEY `uid` (`uid`)
) ENGINE=MyISAM AUTO_INCREMENT=15384514 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci