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)
有多种方法可以删除表的“大部分”。或许最好的就是
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
如果这是一项重复任务,请参阅该链接中的分区建议。
从 InnoDB 表中删除表行时不会自动清理碎片。
您必须手动对表进行碎片整理。
您可以运行以下命令
OPTIMIZE TABLE table1;
Run Code Online (Sandbox Code Playgroud)
这将为您执行以下操作
ALTER TABLE table1 ENGINE=InnoDB;
ANALYZE TABLE table1;
Run Code Online (Sandbox Code Playgroud)
如果您仍然有很多行,这可能会锁定表(这需要停机)。完成后,桌子会变小。确保有足够的磁盘空间用于表重建。
如果您无法承受停机时间,则必须使用pt-online-schema-change对表进行碎片整理。我刚刚在最近的一篇文章中提到:我可以禁用二进制日志以暂时节省空间吗
归档时间: |
|
查看次数: |
11909 次 |
最近记录: |