使用mysql作为数据库新开发的网站系统,上线后发现有时会出错,php报无法连接到数据库的错误,重启mysql后问题可以解决。但不久后,还会出现。查看processlist,发现里面有大量的Locked的进程,这些进程竟然多是很简单的查询语句,如update tab set col=col+1 where id=123 这样的简单查询,过几秒重新查看进程,这些进程还在。按理说这种非常简单的查询是,不可能长时间执行。仔细查看后发现,process list里有一条状态一直是Sending data ,它在长时间执行。将其杀死后,其它的locked的进程就全部没有了。于是可以初步判断,因为一些慢查询在执行的过程中,会因为锁定的原因导致其它小查询无法进行,状态为locked. 于是将注意力放执行最长的进程上,发现它的查询效率相当低,也正是MySQL慢查询记录日志里的语句。该语句采用exists子句查询,参与查询的表较大,条件也比较复杂,改用Join后得以解决。
评论关闭。