2014-01-09 27 views
0

我只是跑的形式,簡單的刪除查詢:MySQL的 - 如何將大量的刪除後刷新表

DELETE*FROM [db.table] WHERE id < [value]; 

這從數據庫中刪除約80萬行(我已經歸檔的數據,並沒有更需要它)。這個系統不斷有數據以每秒大約20次插入的速度進入,現在數據庫中又有數千個條目。

如果我運行一個查詢(僅限於1000行)的排序下降,類似這樣的:

SELECT*FROM [db.table] ORDER BY id DESC; 

我立即得到返回結果,但是如果我升序排列,這樣的:

SELECT*FROM [db.table] ORDER BY id ASC; 

查詢將在10分鐘後超時。在我看來(這只是一個猜測),查詢正在經歷我最近刪除的行的所有ID,並且永遠不會獲得最新的數據。那可能嗎?

如何獲得'排序ASC'查詢的工作?我需要做某種刷新嗎?謝謝

+0

您是否有該領域的索引? –

+0

是的,我相信它是BTREE的Index_type。這聽起來是對的嗎? – jteezy14

回答

1

考慮在大刪除後運行MYSQL的optimize table

重新組織表數據和關聯索引數據的物理存儲,以減少訪問表時的存儲空間並提高I/O效率。對每個表進行的確切更改取決於該表使用的存儲引擎。

文檔瀏覽:http://dev.mysql.com/doc/refman/5.1/en/optimize-table.html

+0

我在sandbox中的數據庫副本上運行了optimize命令。這返回了一條消息,表示「表不支持優化,而是重新創建+分析」。這是什麼告訴我?謝謝。 – jteezy14

+0

這意味着你的表可能是innodb而不是MyISAM,而mySQL卻試圖以不同的方式優化你的表。 – bdf

0

我更喜歡用這種聰明的方式來重新設置自動遞增值:

DELETE * FROM [db.table] WHERE id < [value], 
ALTER TABLE [db.table] AUTO_INCREMENT = [value]; 

順便說一句,我總是設置一個無符號整數主要編號:

ALTER TABLE [db.table] CHANGE `id` `id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT