Mysql

MySQL:在對本身有修改的欄位進行索引時覆蓋原始數據的修改

  • February 17, 2022

我有一個原始數據的 MySQL 表,它對於歷史/審計目的很重要,不應該被更改。我希望能夠通過修改來標記這些數據,例如糾正原始數據輸入中的錯誤,並查看整個複合數據集(覆蓋在原始數據上的更改),而不對 original_data 表進行任何修改。

我的欄位是 int、varchar 和 datetime 的混合;沒什麼奇怪的。

系統目前通過以下方式完成此操作:

  • 一個表original_data(從不修改)。這是在日期時間欄位上索引的。
  • 一個表modify,其中包括 original_data 具有的所有欄位。修改中的每一行都引用 original_data 中被修改行的主鍵。
  • 一個視圖mods_overlay將 original_data 連接到對鍵的修改,顯示修改後的數據(如果存在)代替原始數據。我正在使用 CASE WHEN 語句從修改中返回特定行存在的欄位,否則從 original_data 返回欄位。

到目前為止,一切都很好!問題是,我有數百萬行,我需要修改的欄位之一是索引 original_data 的日期時間欄位。一旦我的 mods_overlay 視圖覆蓋了這個日期時間欄位,我就無法再有效地選擇特定時間段內的數據;選擇語句的執行時間從幾秒增加到 30 多分鐘。MySQL 不支持視圖索引,也不支持物化視圖,這兩者都可以在這裡提供幫助。

一種解決方法:我可以將 mods_overlay 實現為一個在一夜之間預先計算好的表,但是直到第二天才能看到新的修改,我不確定這是否可以接受。

是否有其他方法可以在不進行重大工具更改的情況下解決此問題?

換一種說法:MySQL 中是否有一種最佳實踐,可以提供一種方法來覆蓋一組原始數據(在從未修改過的表中)的一組修改,同時對本身可以修改的欄位進行索引?

很少有使用者使用VIEWs.

典型的做法是對ALTER錶進行所需的架構更改。

pt-online-schema-change如果ALGORITHM=INPLACE無法進行所需的更改,是首選工具。

有一種新方法可以解決這個問題,它可能不適用於您的情況,但我認為值得一看。

一些新的數據庫,例如doltor noms(在連接器方面與 mySQL 兼容)能夠像git實際讓您修改數據一樣工作,同時將原始數據保留在以前的commit. 修改後的數據自然會通過名義索引進行索引。有要求檢查更改的內容等等。

這些數據庫背後的想法是數據可以作為程式碼源在git. 所以表中的數據可以被標記,整個數據庫支持標記和分支,就像原始碼控制一樣。基於此,可以標記您認為是參考的版本,正常更改您的數據,然後使用 請求SELECT somedata FROM mytable FOR COMMIT_HASH AS OF HASHOF("reference-tag"),當然還有SELECT somedata FROM mytable獲取目前狀態的標準。

您還可以通過 diff (dolt_diff_ $ TABLENAME) or history (dolt_history_ $ 表名)。

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