一次在處理慢查詢時,對錶做了分析,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”.