你的空間被剝奪?停機時間不可能嗎?
如果不是,則可以將新列的INT列長度設置爲1,默認爲1表示「活動」(或任何術語),0表示「非活動」。實際上,如果需要,你可以使用0到9作爲10個不同的狀態。
添加這個新列需要花費很長時間,但一旦結束,只要您從主元件開始執行更新(就像使用DELETE操作一樣),您的UPDATE應該快如閃電,而且不會索引這個新元件柱。
InnoDB在如此龐大的表上刪除這麼長時間的原因是因爲集羣索引。它基於您的PRIMARY(或第一個UNIQUE找到...或者無論它發現PRIMARY還是UNIQUE都沒有),所以當你拔出一行時,它現在會在磁盤上物理地重新整理你的ENTIRE表,以便進行速度和碎片整理。所以這不是DELETE這麼長時間。這是刪除行後的物理重新排序。
當您使用默認值創建一個新的INT列時,空間將被填充,因此當您更新它時,不需要對您的巨大表格進行物理重新排序。
我不確定你的模式究竟是什麼,但使用列的狀態比DELETEing快得多;但是,它會佔用更多的空間。
嘗試設置值:
innodb_flush_log_at_trx_commit=2
innodb_flush_method=O_DIRECT (for non-windows machine)
innodb_buffer_pool_size=25GB (currently it is close to 21GB)
innodb_doublewrite=0
innodb_support_xa=0
innodb_thread_concurrency=0...1000 (try different values, beginning with 200)
參考文獻:
MySQL docs for description of different variables.
MySQL Server Setting Tuning
MySQL Performance Optimization basics
http://bugs.mysql.com/bug.php?id=28382
1 Bn行相當多。除了pkey之外,桌面上還有任何索引嗎?刪除行時,索引必須更新,這可能需要時間。 我不確定它是否會在這種情況下工作,但是您可以嘗試在事務中執行刪除並查看它是否工作得更好? – troelskn
對於OP,您可以更新我們對此的結果,我真的很感興趣。 :) –
刪除非常緩慢。在10.000s的部分中刪除的方法可行 - 但這並沒有加速整個過程。我結束了以下工作:使用mysqldump將表格轉儲到一個文件中。然後,我使用sed -i'1,1000000d'file.sql從轉儲文件中刪除行。我截斷了表格並重新載入了轉儲文件......結果是最快的方法... – user1938509