delete對性能會有影響,一般不建議硬性delete數據,而是標記deleted = 1這種軟刪除
為啥呢?
根據之前了解的mysql底層存儲原理
最小存儲單元page頁,無論是非葉子節點page存的是索引key和指針,還是葉子節點存的是行數據
1.當刪除大量數據時
MySQL內部不會真正刪除空間,而且做標記刪除,即將delflag:N修改為delflag:Y,commit之后會會被purge進入刪除鏈表,
如果下一次insert更大的記錄,delete之后的空間不會被重用,如果插入的記錄小於等於delete的記錄空會被重用
2.當少量刪除中間數據時
你在中間刪了某些個值,實際上只是找到那個page頁找到對應的數據做刪除標記,並不會實際影響page頁已經占的大小,這塊空間可能也永遠不會被利用,產生了內存碎片
導致索引頻繁分裂,影響SQL執行計划的穩定性
正確姿勢:
使用deleted = 1 字段來軟刪除,保證索引連續性,
必要時,可將deleted = 0的字段完整遷移到新表,解決碎片問題