場景:在給一張有幾萬條記錄的表添加索引時,進度非常慢,導致其它查詢無法進行
處理方式:
- 命令行模式下,執行以下命令:
show processlist;這時會看到有哪些線程正在執行,也可以查看鎖表的線程。你會發現alter table * add key ****那個線程狀態是Waiting for table metadata lock,后面有個這個表的所有操作都是這個狀態,很明顯是這條加索引的語句把表給鎖了。
- 查看線程ID,執行
kill 線程ID;這樣被鎖住的表就能立即被使用了。
拓展2:
如果數據庫中有鎖的話,我們可以使用這條語句來查看運行的所有事務:
select * from information_schema.innodb_trx;也能得到 trx_mysql_thread_id 為線程ID;
結論:
- 當一張表數據量很大時,不要輕易添加索引,會導致表被鎖死!
- 如果非要添加,那么應該先把數據表進行備份,然后進行空表添加索引。