我有下表:
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实用程序重新组织表。