mysql創建索引導致鎖表阻塞查詢

在數據庫oracle遷移到mysql的過程中,因爲團隊每個人都負責了一些模塊,難免會對錶的操作有衝突,比如我正在給這張表創建索引,但是他卻在進行查詢,這樣就會導致雙方都失敗。

正所謂MySQL在進行alter table等DDL操作時,有時會出現Waiting for table metadata lock的等待場景。而且,一旦alter table TableA的操作停滯在Waiting for table metadata lock的狀態,後續對TableA的任何操作(包括讀)都無法進行,因爲他們也會在Opening tables的階段進入到Waiting for table metadata lock的鎖等待隊列。如果是產品環境的核心表出現了這樣的鎖等待隊列,就會造成災難性的後果

解決方法通過命令查看慢查詢:
select * from information_schema.processlist where command not in (‘Sleep’)
發現有慢SQL,針對該表。
解決方式:kill掉慢SQL進程,索引添加立刻完成

附上慢sql問題解析:

ALL, index, range, ref, eq_ref, const, system, NULL

ALL:Full Table Scan, MySQL將遍歷全表以找到匹配的行
index:Full Index Scan,index與ALL區別爲index類型只遍歷索引樹
range:索引範圍掃描,對索引的掃描開始於某一點,返回匹配值域的行。顯而易見的索引範圍掃描是帶有between或者where子句裏帶有<, >查詢。當mysql使用索引去查找一系列值時,例如IN()和OR列表,也會顯示range(範圍掃描),當然性能上面是有差異的。
ref:使用非唯一索引掃描或者唯一索引的前綴掃描,返回匹配某個單獨值的記錄行
eq_ref:類似ref,區別就在使用的索引是唯一索引,對於每個索引鍵值,表中只有一條記錄匹配,簡單來說,就是多表連接中使用primary key或者 unique key作爲關聯條件。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章