2013-06-13 49 views
3

後需要很長的,我有以下表格:COUNT(*)甚至刪除所有行

CREATE TABLE Sdata(uid INTEGER, timestamp DATETIME, value REAL, FOREIGN KEY (uid) REFERENCES Series_uid(uid)); 

在一個點上,這個表了〜90M行。 我查詢了SELECT COUNT(*) FROM Sdata;,耗時約7分鐘。

然後我進行到DELETE FROM Sdata;。這個查詢花了一個多小時,考慮到大尺寸這是可以理解的。 從Sdata刪除所有行後,我再次運行COUNT。這一次它仍然花了大約7分鐘。

我很困惑,爲什麼COUNT仍然需要一段時間,即使表現在是空的。這裏發生了什麼?

+0

哪個存儲引擎? – Prinzhorn

+0

所有的表都使用InnoDB。 – leonsas

+1

我不是100%的MySQL,因此爲什麼這是一個評論而不是答案,但是:嘗試使用'TRUNCATE SData'而不是'DELETE FROM SData' - 'DELETE FROM'將會清空表格,但可能不會完全清理它起來。 'TRUNCATE'實際上在內部丟棄和重建表(如果你有一個自動增量標識字段,它也會重置爲1)。也可以嘗試'OPTIMIZE TABLE SData' – Kai

回答

5

DELETE FROM Sdata之後嘗試使用OPTIMIZE TABLE Sdata真正放棄未使用的行,或在將來使用TRUNCATE Sdata,這將自動爲您執行此操作。從here

報價:

在MyISAM表,刪除的行保持在一個鏈表和隨後的INSERT操作會重新使用舊的記錄位置。要回收未使用的空間並減小文件大小,請使用OPTIMIZE TABLE語句或myisamchk實用程序重新組織表。