同事说他负责的项目组其中一个统计页面非常慢,有的时候半个小时都出不来数据,但是有的时候又非常快!直接show processlist,发现truncate table t1语句在Waiting for table metadata lock!


同事说t1是一个临时中间表,用来存放临时统计页面的数据!每次每个用户刷新该页面就调用一次存储过程!而且在调用存储过程之前是由程序控制事务!查看了统计预计,都是count(*)之类的,非常慢,这个时候执行一次存储过程需要等较长时间!

因为有事务控制存储过程调用,所以在执行过程中,select语句会加上metadata lock在该表上,就是ddl不能操作该表,而他的存储过程每次执行的时候,都要truncate table t1.

找到原因所在,建议他在表中加上毫秒级别的时间戳,用户通过该时间戳获取自己当前的统计信息,这样既不会锁表,也不会出现数据异常!


另外还有一个原因造成Waiting for table metadata lock!不过我没有碰到过,贴一下地址

http://www.mysqlops.com/2012/07/03/%E5%85%B3%E4%BA%8E-innodb_stats_on_metadata-%E7%9A%84%E8%AE%BE%E7%BD%AE%E9%97%AE%E9%A2%98.html