天天看點

mysql加索引,資料庫卡死

公司的一個内部項目,由于突然導入了幾十萬的資料,資料量翻了一倍,導緻了某個頁面打開很慢。通過sql日志看到主要是由于慢查詢引起的,通過explain這個sql,發現主要是由于這個SQL沒有命中索引,進行了全表掃描,慢是肯定了的。

為了優化這個頁面,主要想到了從以下方法進行解決:

1)重寫Sql,讓查詢命中索引

2)增加索引

3)1)或者2)方法之後,再加上一個緩存功能

最快捷的方式肯定是2了,但是本表由于邏輯複雜,時不時又批量錄入一些資料,已經有了5個索引了,再加索引,恐怕會導緻寫入慢的問題,而且加索引可能會引起鎖表問題。

于是,我先想用方法1解決,可是由于邏輯有點複雜,查詢語句比較複雜,改了很多寫法都不理想,最後還是選擇了方法2,直接表加索引。

由于對于加索引的一些擔憂,于是我在本地先嘗試了一下(本地資料和線上資料量基本一緻,相差不大),結果沒想到還挺快的,對于寫入的性能也沒多大的影響。加入索引後頁面秒開,效果很好。

于是,在晚上的時候,到線上去加索引。結果。。。。悲劇發生了,那張表果然被鎖死了,由于那張表還是一張很重要的表,很多業務都跟那張表挂鈎,導緻很多服務都用不上了。

可是表鎖死了,也不能做啥操作,怎麼辦呢?還好有show processlist,可以檢視哪些線程正在執行,也可以檢視鎖表的線程。

mysql加索引,資料庫卡死

結果,發現alter table * add key ****那個線程狀态是Waiting for table metadata lock,後面有個這個表的所有操作都是這個狀态,很明顯是這條加索引的語句把表給鎖了。

檢視線程的id,然後kill id号把這個線程殺死。

果然,殺死了,這張表立馬就可以用了。

是以,當資料量較大的時候,不要随便加索引,會導緻表鎖死的。

無奈,隻能選擇另外的方式解決那個慢查詢的問題了。

繼續閱讀