2010-07-28 67 views
0

我有一個cron運行多行,刪除「壞」的(根據我的標準)。我只是想知道什麼是最好的優化腳本。我可以執行以下操作之一:速度更快/效率更高:連續刪除或連續更新+間歇刪除?

  1. 具有相同的cron在找到它們時立即刪除「壞」行。

  2. 讓cron立即將「壞」行更新爲狀態「1」,這意味着不好。然後,我可以設置另一個運行一小時的cron,刪除狀態爲「1」的所有行。爲了加快速度,我想我會有一個關於「狀態」的索引,但這也可能會破壞性能。

有什麼建議嗎?

回答

1

我沒有經驗的MySQL,但在其他DBMS我工作的更新,然後刪除沒有幫助。只需嘗試使用大量數據並測量刪除與更新+刪除的時間。如果作爲「不好」的標準的列具有索引,這會有所幫助。

2

具有兩個可能值的字段上的索引並不像您想象的那樣有用,特別是如果您不斷更改要索引的字段。例如,假設您有一個包含100,000行數據的表,並且最初對於每行(在刪除週期之後和更新週期之前)「狀態」設置爲0。在那個時候,使用該索引相當於對錶進行順序搜索。如果您更新1,000行,將其狀態標記爲1,則您的索引需要更新(並可能重新平衡)1,000次。最後,當你刪除所有狀態爲== 1的行時,你就可以利用索引(你只看1%的行),但是你需要更新索引1000次(in除了刪除行)。

國際海事組織,你最好直接選擇'壞'行並立即刪除它們 - 你消除了索引不夠用的開銷,以及第二個查詢的開銷。

注意:根據您的數據庫,刪除操作可能非常快,或者非常慢。最終,刪除一行涉及將一行標記爲未使用,然後將該行所佔用的空間返回到表中,以便插入新行。這由可變長度的行(由於可變長度數據類型)和內部實現細節而變得複雜。例如,PostgresQL只是將一行標記爲已刪除,然後使用單獨的手動調用的過程(vacuum)將已刪除行使用的空間返回到表中以供新行使用。我相信PostegresQL仍然將行更新視爲刪除操作,然後是插入操作。 MySQL和Oracle和SQL Server都有不同的方法來實現相同的最終結果,每個方法都會對系統性能產生更多的副作用。

您需要研究您的文檔和任何性能指南,以確定哪些最適合您的系統。

0

如果您正在考慮將行更新爲壞,然後再刪除它,則會給服務器帶來額外的壓力。

直接刪除它們是更好的選擇。

如果您認爲會出現大量壞行,請按照不會一次刪除超過100行的方式創建cron。這應該在一定程度上限制服務器負載。