【问题标题】:COUNT(*) takes long even after deleting all rowsCOUNT(*) 即使在删除所有行之后也需要很长时间
【发布时间】:2013-06-09 13:22:18
【问题描述】:

我有下表:

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

在某一时刻,该表有大约 9000 万行。 我查询了SELECT COUNT(*) FROM Sdata;,花了大约 7 分钟。

然后我转到DELETE FROM Sdata;。这个查询花了一个多小时,考虑到大尺寸,这是可以理解的。 从Sdata 删除所有行后,我再次运行COUNT。这次还是花了大约 7 分钟。

我很困惑为什么COUNT 仍然需要一段时间,即使表格现在是空的。这是怎么回事?

【问题讨论】:

  • 哪个存储引擎?
  • 所有表都在使用 InnoDB。
  • 我不是 100% 使用 MySQL,因此为什么这是评论而不是答案:尝试使用 TRUNCATE SData 而不是 DELETE FROM SData - DELETE FROM 将清空表格,但可能不完全清理它。 TRUNCATE 实际上在内部删除并重建表(如果您有一个自动增量标识字段,它也会重置为 1)。也可以试试OPTIMIZE TABLE SData

标签: mysql count delete-row sql-delete


【解决方案1】:

DELETE FROM Sdata 之后尝试使用OPTIMIZE TABLE Sdata 来真正丢弃未使用的行,或者在将来使用TRUNCATE Sdata,它会自动为您执行此操作。

引用here:

在 MyISAM 表中,已删除的行保存在一个链表中,随后的 INSERT 操作重用旧的行位置。要回收未使用的空间并减小文件大小,请使用 OPTIMIZE TABLE 语句或 myisamchk 实用程序来重新组织表。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-18
    • 1970-01-01
    • 2015-03-31
    • 1970-01-01
    • 1970-01-01
    • 2011-02-07
    相关资源
    最近更新 更多