一次在处理慢查询时,对表做了分析,ANALYZE TABLE ,之后不久,应用反应数据库查询很慢,通过
show full processlit;
查看 发现与该表相关的大量查询状态均变成了Waiting for table flush。
mysql决定使用哪一个执行计划的是由所使用存储引擎提供的相关信息。
触发Waiting for table flush条件:
1.大量并发
2.长时间运行状态的查询
3.在对一个表进行长时间运行状态的查询时执行ANALYZE TABLE
造成此问题原因是当ANALYZE TABLE后,需要查询这个表的线程状态变为等待,因为mysql已经检测到表信息已经改变,
它需要关闭重新使用FLUSH打开此表.因此表将被锁住,直到所有已经运行的查询结束。
解决此问题只有两个方法,要么杀掉所有的长查询或等查询结束 ,要么在低负载下执行。
FLUSH TABLES, ALTER, RENAME, OPTIMIZE ,REPAIR 都有可能引发线程状态变为
“Waiting for tables”, “Waiting for table” , “Waiting for table flush”.