有時候咱們會不當心對一個大表進行了 update,好比說寫錯了 where 條件......
此時,若是 kill 掉 update 線程,那回滾 undo log 須要很多時間。若是放置無論,也不知道 update 會持續多久。
那咱們能知道 update 的進度麼?數據庫
咱們先建立一個測試數據庫:session
快速建立一些數據:測試
連續執行一樣的 SQL 數次,就能夠快速構造千萬級別的數據:spa
查看一下總的行數:線程
咱們來釋放一個大的 update:3d
而後另起一個 session,觀察 performance_schema 中的信息:orm
能夠看到,performance_schema 會列出當前 SQL 從引擎獲取的行數。
等 SQL 結束後,咱們看一下 update 從引擎總共獲取了多少行:blog
能夠看到該 update 從引擎總共獲取的行數是表大小的兩倍,那咱們能夠估算:update 的進度 = (rows_examined) / (2 * 錶行數)it
?小貼士
information_schema.tables 中,提供了對錶行數的估算,比起使用 select count(1) 的成本低不少,幾乎能夠忽略不計。
那麼是否是全部的 update,從引擎中獲取的行數都會是表大小的兩倍呢?這個仍是要分狀況討論的,上面的 SQL 更新了主鍵,若是隻更新內容而不更新主鍵呢?咱們來試驗一下:io
等待 update 結束,查看 row_examined,發現其恰好是表大小:
那咱們怎麼準確的這個倍數呢?
一種方法是靠經驗:update 語句的 where 中會掃描多少行,是否修改主鍵,是否修改惟一鍵,以這些條件來估算係數。
另外一種方法就是在一樣結構的較小的表上試驗一下,獲取倍數。
這樣,咱們就能準確估算一個「不當心」執行的大型 update 的進度了。
關於 MySQL 的技術內容,大家還有什麼想知道的嗎?趕忙留言告訴小編吧!