2011-02-19 43 views
2

從大型數據庫中刪除可能是一個常見問題,但我想問的不是如何做到這一點。從大型數據庫中刪除數據

  1. 從我在線閱讀的內容來看,從大型數據庫中刪除的最佳/有效的方法是每隔一段時間刪除少量數據。在我的情況下,我不能做TRUNCATE,因爲數據是不斷寫入數據庫的,我可能會在執行TRUNCATE時失去一些,對吧?

  2. 當從DB刪除數據,在或大或小的量,它創建這會降低性能的開銷。我可以通過在刪除後優化表來處理這個問題。我不知道的是優化會導致數據讀取或寫入數據庫的任何問題此刻?

也許我對我的刪除數據的方法是錯誤的。如果你有任何建議,將有很大的幫助。

+0

之前做什麼,如果數據真的是原因的性能問題,你應該確切點。你的數據庫大小是多少?表中給出問題的記錄數。你看到任何緩慢的查詢。你正在使用什麼存儲引擎?你有沒有采取任何措施來調整MySQL? – Zimbabao

+0

我還沒有開始刪除任何東西,我正在研究什麼是最好的方式,所以目前沒有性能問題。我沒有看到任何緩慢的查詢,因爲特定的數據庫(大約1米條目)只能通過請求特定索引來訪問(讀取)。它是一個MySQL數據庫MyISAM表 –

回答

1

也許你應該把你從刪除任何表並執行以下操作

在這個例子表mytable的

  1. CREATE TABLE newtable的LIKE MYTABLE ;

  2. ALTER TABLE MYTABLE RENAME oldtable;

  3. ALTER TABLE newtable的RENAME MYTABLE;

  4. TRUNCATE TABLE oldtable;

通過這種方式,表格可用於寫入新數據,並且您可以花費時間同時轉換舊錶格。

0
  1. MySQL不會丟失數據。可能發生的是剛剛刪除的數據的查詢/更新,但客戶端需要獲取更多詳細信息等。有時,在大型刪除或截斷時,數據庫將在來自客戶端的調用上超時。客戶如何對超時做出反應取決於他們。在這種情況下,您必須檢查客戶端如何處理該錯誤。

  2. 任何「優化」(具體是什麼,你在想的?)應該在非高峯時間發生。衡量你的數據庫的活動,並找出什麼時間最適合執行相對於用戶流量模式的維護(索引,重建統計)。考慮一個正式的計劃停機時間/停機

+0

通過優化我的意思是在執行刪除操作後運行OPTIMIZE TABLE表查詢。我認爲這應該是足夠的權利?也會影響任何寫入數據庫? –

0

我不知道你需要刪除大量的數據。但是,如果您需要定期刪除「舊」數據,則可以使用MERGE表查看。您可以從具有相同結構的任何MyISAM表中創建MERGE表。

例如,您可以爲每個日曆季度創建一個表格。在每個季度結束時,您將創建一個新的空表格並重新聲明組成MERGE表格的表格。所以MERGE表格總是有過去數年的數據。如果您的代碼始終引用MERGE表,則在「遷移」數據時不需要更改任何內容。重新聲明MERGE表的UNION表幾乎是即時的。

這只是一個例子,但您可以按照自己喜歡的方式分隔數據。

http://dev.mysql.com/doc/refman/5.0/en/merge-storage-engine.html