2013-06-13 48 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实用程序重新组织表。