是否可以對所有讀取使用預設分區?
我有一個遺留應用程序,它廣泛地查詢它的一個數據庫(AWS Aurora 上的 MySQL)表。很多查詢和很多查詢類型。此表中 90% 的行已過時並標記為
is_deleted
。我想嘗試使性能更好,所以我想到了對錶進行分區is_deleted
並使所有查詢都轉到is_deleted=false
. 問題是我需要重寫數百甚至數千個查詢才能插入is_deleted
到where
每個查詢的子句中。有沒有辦法將
is_deleted = false
分區定義為所有讀取的預設分區?如果沒有,還有其他方法可以做到這一點嗎?
如果沒有需要查詢軟刪除記錄的情況,更簡單的機制是為已刪除記錄創建一個表。然後,您可以實施一個計劃作業,將所有
is_deleted = true
記錄複製到歷史表並從源表中刪除原始記錄。這樣做可以確保主表包含所有活動記錄,並且不需要更新應用程序查詢。
如果寫入不經常發生,您甚至可以考慮使用
AFTER UPDATE
觸發器自動從表中複製(並且可能刪除)軟刪除的記錄,因為它們已失效。我相信,如果遍歷所有應用程序 SQL 查詢是站不住腳的,這將更容易實現🤔
考慮
is_deleted
在許多INDEXes
. 然後,每當WHERE
子句測試該列時,(使用=
),您將獲得所需的性能。警告:有很多微妙的事情可能會搞砸。請提供
SHOW CREATE TABLE
和主要的SELECTs
,UPDATEs
所以我可以進一步建議。更多的
is_deleted
計劃 A:所有(?)查詢通過在WHERE
子句中顯式過濾。以及對性能的INDEX(s)
幫助。計劃 B:從表中刪除“已刪除”行,可能將它們移動到另一個表。這需要額外的程式碼來顯式地將行從一個表“移動”到另一個表。
方案 C:
PARTITION
將表分成兩個基於is_deleted
. 這結合了計劃 A 和 B 的最佳和最差。我不推薦它;它很笨拙,仍然需要更改程式碼。更改is_deleted
“自動”的值會從一個分區中刪除該行並將其添加到另一個分區。但是WHERE
條款的改變仍然是必要的。或者您可以顯式指定分區 - 無論哪種方式都會對 all(?) 進行更改SELECTs
。由於. _UNIQUE
_FOREIGN KEY``PARTITION