2010-12-16 108 views
4

我正在開發一個社交網絡,就像Facebook的一個子集。我認爲這意味着應用程序將比重寫更重(即比插入,更新或刪除更多的選擇)mysql表格和刪除策略

我打算使用MyISAM爲數據庫使用MySQL。數據庫中的每個表將包含以下三個領域:

  • CREATED - 包含記錄被修改
  • ROWSTATUS時間日期字段 - 包含記錄的創建
  • UPDATED時間日期字段 - 包含單個字符標誌的CHAR(1)字段,用於顯示記錄是活動,未激活還是已刪除(分別使用值「A」,ID)。

通過一個PHP包裝類,我們確保所有SELECT查詢都包含ROWSTATUS,並且UPDATE查詢也更新了UPDATED列,而INSERT查詢更新了CREATED列。

我打算不實際刪除任何記錄,而選擇將該記錄的ROWSTATUS字段更新爲D以顯示它被刪除(即軟刪除)。

我們有一個SQL過程,它在10天后物理刪除已刪除的數據。

但是,我正在通過this article,它認爲,由於鎖定開銷,不需要物理刪除。相反,作者建議使用此方案:

SELECT e.eventid,e.title 
    FROM events e 
    WHERE NOT EXISTS 
    (SELECT * FROM event_deletes ed WHERE ed.eventid = e.eventid); 

我想知道我的方案如何與此提議的機制進行比較,哪一個更好?我自己無法達成任何明確的答案。

+0

接受一點鹽的建議。該文章發表後近7年發生了很大變化。 – 2010-12-16 06:35:49

+0

你有計劃使用MyISAM而不是InnoDB的原因嗎? – AgentConundrum 2010-12-16 06:39:50

+0

@AgentConundrum ...我們已經在使用MyISAM,我正在考慮遷移到InnoDB。只是想調查利弊 – Ahmad 2010-12-16 07:11:12

回答

2

正如@ Pentium10所說,你的計劃沒有任何內在錯誤。這實際上是一個相當標準的方法。

問題是,如果您使用的是MyISAM,您的UPDATE將導致整個表在查詢運行時鎖定。這會造成瓶頸,因爲您一次只能更新或刪除單個記錄。

除非您有使用MyISAM的原因,否則我建議您切換到InnoDB作爲您的數據庫引擎。 InnoDB使用行級鎖定,因此您的UPDATE查詢不會阻止其他UPDATE。它還具有其他一些很好的功能,如支持事務和參照完整性約束。

+0

是的..我認爲這是有道理..我錯了。我們應該選擇InnoDB來充分利用我們的數據庫設計。指的是參照完整性。以及我們根本不使用外鍵。我們試圖通過我們的代碼來管理所有的東西。 – Ahmad 2010-12-16 07:14:16

0

我在這裏看到的唯一的問題,與那篇文章相比,你只處理DELETE調用的鎖。

您應該知道UPDATE和DELETE語句總是需要在MyISAM表上發出排它鎖。

這就是文章建議使用INSERT而不是UPDATE行狀態的原因。你應該像文章所說的那樣去。創建一個專用表來存儲已刪除的ID,並使用建議的聯接來檢索未刪除的記錄。通過這種方式在最終用戶的刪除操作上,您只需插入表中,並且不會在表上導致UPDATE鎖定。如果向兩個表中添加適當的鍵,聯接將僅在索引上完成,在SELECT上它將快速完成。

如果您存儲更新的時間,您還將介紹開銷。你應該放棄這個想法,因爲沒有用處,你不會用來告訴更新記錄的時間。

+0

是的。感謝你的回答。基本上我錯了。引用UPDATED列。實際上我們也用它來查找一些信息;特別是在報告模塊 – Ahmad 2010-12-16 07:16:34