我有下表:

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仍然需要一段时间。这是怎么回事?

最佳答案

DELETE FROM Sdata之后,尝试使用OPTIMIZE TABLE Sdata来真正丢弃未使用的行,或者在将来使用TRUNCATE Sdata来自动为您这样做。
引自here
在myisam表中,被删除的行被维护在一个链表中,随后的插入操作重用旧的行位置。要回收未使用的空间并减小文件大小,请使用optimize table语句或myisamchk实用程序重新组织表。

09-06 19:52