MySQL:DELETE 没有缩小数据库大小,也没有缩小表大小

Eng*_*ng7 5 mysql innodb delete

在 中mydatabase,有一个table1近 8M 行的表,从表中删除大约 7M 行后,数据库和表本身的大小保持不变。

桌子尺寸:

+---------------------------------------------+-----------+
| Table                                       | Size (MB) |
+---------------------------------------------+-----------+
| Table1                                      |     96000 |
Run Code Online (Sandbox Code Playgroud)

删除查询:

DELETE FROM table1 WHERE foo < 'boo'; 
Query OK, 7809000 rows affected (43.25 sec)
Run Code Online (Sandbox Code Playgroud)

删除数据后的大小:

+---------------------------------------------+-----------+
| Table                                       | Size (MB) |
+---------------------------------------------+-----------+
| Table1                                      |     96000 |
Run Code Online (Sandbox Code Playgroud)

知道为什么从该表中删除数据并没有减少数据库大小吗?

服务器版本:5.7.19-17-log Percona Server (GPL)

Ric*_*mes 7

有多种方法可以删除表的“大部分”。或许最好的就是

SET @@innodb_file_per_table = ON; -- if this is not already on  (optional)

CREATE TABLE new LIKE real;
INSERT INTO new
    SELECT * FROM real
        WHERE ... -- the rows you want to _keep_;
RENAME TABLE real TO old,
             new TO real;
DROP TABLE old;
Run Code Online (Sandbox Code Playgroud)

更多技术: http://mysql.rjweb.org/doc.php/deletebig

如果这是一项重复任务,请参阅该链接中的分区建议。


Rol*_*DBA 5

从 InnoDB 表中删除表行时不会自动清理碎片。

您必须手动对表进行碎片整理。

方法#1

您可以运行以下命令

OPTIMIZE TABLE table1;
Run Code Online (Sandbox Code Playgroud)

这将为您执行以下操作

ALTER TABLE table1 ENGINE=InnoDB;
ANALYZE TABLE table1;
Run Code Online (Sandbox Code Playgroud)

如果您仍然有很多行,这可能会锁定表(这需要停机)。完成后,桌子会变小。确保有足够的磁盘空间用于表重建。

方法#2

如果您无法承受停机时间,则必须使用pt-online-schema-change对表进行碎片整理。我刚刚在最近的一篇文章中提到:我可以禁用二进制日志以暂时节省空间吗