聽說MySQL頻繁的刪除數據會影響性能,請問原理是什麼? 能影響到什麼程度?
我有一個2千萬數據的表A,最近想拆分一下.
將一部分數據從表A複製到表B,同時從表A中刪掉該部分數據.
今後每日從表A中搬運一部分數據到表B
之前聽說這種高頻度的刪除操作極其影響MySQL的性能, 真的嗎?請問原理是什麼?能影響到什麼程度? 怎麼避開?
情況1 :
一個大表幾千萬數據,想要拆分
需要將一部分數據從表A複製到表B,同時刪除A的部分數據,每天搬運N%數據
情況2 :
實體臨時表,每次執行一個SP的時候會先delete刪除,之後再執行SP新增資料
聽說以上這種高頻度的刪除操作非常影響資料庫性能
請問原理是什麼? 能影響到什麼程度? 如何避免呢?
這邊嘗試找到一篇文章 , 有解決我的疑惑 , 這是他的原文
- 產生
大量碎片
,影響磁盤IO;- 另外會影響索引的基數
Cardinality
值,從而導致關聯sql時使用不當的索引;- 如果數據庫拓撲中有做主從同步,一次性delete大量數據,會出現
主從同步延遲
。首先要了解下,對mysql進行刪除數據操作,磁盤空間並不會立即被回收,這裡的空間包括數據和索引空間,但是可能被後續的insert利用,也可能不會,就形成碎片。
怎麼測試刪除數據mysql沒有立即回收空間呢?
很簡單,首先創建一個innodb表tb,往裡插入大量數據(比如10w條),這個時候看下tb的數據文件tb.ibd的大小,記錄下來;此時再把tb表數據刪除(delete from tb
),然後再看下tb.ibd的大小,會發現沒有變化,也就是沒被回收!當然更關注的是怎麼解決。
問題1、2都可以通過執行OPTIMIZE TABLE 表名
來優化表,重新組織表數據和關聯索引數據的物理存儲。(執行完再去看看.ibd的大小是不是變小了)
主從同步延遲的問題則是按照上面說的,分批間隔幾分鐘刪除,把大事務化成小事務去執行。最後再說下,這種遷移數據到另外一張表,然後刪除大表數據,叫做
MySQL歸檔
,隨便搜下就有,給個傳送門MySQL大表數據歸檔的幾種方法介紹
江湖傳聞聽說....
你們公司應該要有技術方面的整體規劃,而不是這樣零散的問.
因為片段的發問,會與真正的情況,有偏差.
重要的是"目的" 或 "目標", 而非 "手段", 更不是某種手段的疑慮.
聽說這種高頻度的刪除操作極其影響MySQL的性能
你聽誰說的,就去問他應該比較準
修改回答:
我的原則是
快問快答、簡問簡答、聽說問就聽說答
看來你在這裡已經得到答案了
但我還是不知道你從那裡聽說「高頻度的刪除操作極其影響MySQL的性能」的
所以我的答案還是一樣你聽誰說的,就去問他應該比較準