第11問:不當心對一個大表進行了 update,怎麼看進度?

一問一實驗 頭圖.png

問題

有時候咱們會不當心對一個大表進行了 update,好比說寫錯了 where 條件......
此時,若是 kill 掉 update 線程,那回滾 undo log 須要很多時間。若是放置無論,也不知道 update 會持續多久。
那咱們能知道 update 的進度麼?數據庫

實驗

咱們先建立一個測試數據庫:session

1.png

快速建立一些數據:測試

2.png

連續執行一樣的 SQL 數次,就能夠快速構造千萬級別的數據:spa

3.png

查看一下總的行數:線程

4.png

咱們來釋放一個大的 update:3d

5.png

而後另起一個 session,觀察 performance_schema 中的信息:orm

6.png

能夠看到,performance_schema 會列出當前 SQL 從引擎獲取的行數。
等 SQL 結束後,咱們看一下 update 從引擎總共獲取了多少行:blog

7.png

能夠看到該 update 從引擎總共獲取的行數是表大小的兩倍,那咱們能夠估算:update 的進度 = (rows_examined) / (2 * 錶行數)it

8.png

?小貼士
information_schema.tables 中,提供了對錶行數的估算,比起使用 select count(1) 的成本低不少,幾乎能夠忽略不計。

那麼是否是全部的 update,從引擎中獲取的行數都會是表大小的兩倍呢?這個仍是要分狀況討論的,上面的 SQL 更新了主鍵,若是隻更新內容而不更新主鍵呢?咱們來試驗一下:io

9.png

等待 update 結束,查看 row_examined,發現其恰好是表大小:

10.png

那咱們怎麼準確的這個倍數呢?
一種方法是靠經驗:update 語句的 where 中會掃描多少行,是否修改主鍵,是否修改惟一鍵,以這些條件來估算係數。
另外一種方法就是在一樣結構的較小的表上試驗一下,獲取倍數。
這樣,咱們就能準確估算一個「不當心」執行的大型 update 的進度了。


關於 MySQL 的技術內容,大家還有什麼想知道的嗎?趕忙留言告訴小編吧!
黃炎自媒體.png

相關文章
相關標籤/搜索