Mysql

是否可以對所有讀取使用預設分區?

  • June 16, 2021

我有一個遺留應用程序,它廣泛地查詢它的一個數據庫(AWS Aurora 上的 MySQL)表。很多查詢和很多查詢類型。此表中 90% 的行已過時並標記為is_deleted。我想嘗試使性能更好,所以我想到了對錶進行分區is_deleted並使所有查詢都轉到is_deleted=false. 問題是我需要重寫數百甚至數千個查詢才能插入is_deletedwhere每個查詢的子句中。

有沒有辦法將is_deleted = false分區定義為所有讀取的預設分區?如果沒有,還有其他方法可以做到這一點嗎?

如果沒有需要查詢軟刪除記錄的情況,更簡單的機制是為已刪除記錄創建一個。然後,您可以實施一個計劃作業,將所有is_deleted = true記錄複製到歷史表並從源表中刪除原始記錄。

這樣做可以確保主表包含所有活動記錄,並且不需要更新應用程序查詢。

如果寫入不經常發生,您甚至可以考慮使用AFTER UPDATE觸發器自動從表中複製(並且可能刪除)軟刪除的記錄,因為它們已失效。

我相信,如果遍歷所有應用程序 SQL 查詢是站不住腳的,這將更容易實現🤔

考慮is_deleted在許多INDEXes. 然後,每當WHERE子句測試該列時,(使用=),您將獲得所需的性能。

警告:有很多微妙的事情可能會搞砸。請提供SHOW CREATE TABLE和主要的SELECTsUPDATEs所以我可以進一步建議。

更多的

is_deleted計劃 A:所有(?)查詢通過在WHERE子句中顯式過濾。以及對性能的INDEX(s)幫助。

計劃 B:從表中刪除“已刪除”行,可能將它們移動到另一個表。這需要額外的程式碼來顯式地將行從一個表“移動”到另一個表。

方案 C: PARTITION將表分成兩個基於is_deleted. 這結合了計劃 A 和 B 的最佳和最差。我不推薦它;它很笨拙,仍然需要更改程式碼。更改is_deleted“自動”的值會從一個分區中刪除該行並將其添加到另一個分區。但是WHERE條款的改變仍然是必要的。或者您可以顯式指定分區 - 無論哪種方式都會對 all(?) 進行更改SELECTs。由於. _ UNIQUE_FOREIGN KEY``PARTITION

引用自:https://dba.stackexchange.com/questions/292337