如何解决mysql delete表数据后,表空间大小不变的问题?

说白了,数据库中删除后留下的碎片是个大问题。
其实很简单。
删除操作只是标记数据的删除,并没有真正清除文件数据。
首先,我们来谈谈最重要的事情。
去年我们运行了一个大约有 3 000 个数据量的项目。
删除操作后,空间占用仅增加5 %。
另外,删除条件遵循和条件不遵循时,空间变化是完全不同的。
当执行立即无条件删除时,数据表空间将被清空,但当条件满足时,空间大小不会改变。
等等,还有一件事很多人没有注意到。
即使数据已被删除,它们仍然在数据库中,但它们被标记为已删除。
稍后的插入将再次使用这些空格。

我一开始以为是删除操作后数据库自动优化了,后来发现不对劲。
我们需要手动清理这些碎片。
这个时候,就极其有必要使用最好的训练了。
命令语法:OPTIMIZE[LOCAL|NO_WRITE_TO_BINLOG]TABLEtbl_name[,tbl_name]...,例如optimizetablephpernote_article;。
如果您删除了表的大部分内容或对包含可变长度行的表进行了许多更改,则应该使用 OPTIMIZER。

又一个伟大的作品。
OPTIMIZETABLE仅适用于MyISAM、BDB和InnoDB表,并且在操作过程中表会被锁定,所以最好在页面流量较少的时候进行。
PRINT 语句清除整个表,保留结构并刷新它。
这样可以快速减少占用的空间,但会丢失所有数据,因此不适合需要保留数据的场景。

我认为应该尝试一下。
定期优化数据库不仅可以提高数据库性能,还可以节省存储空间。
那你呢,有遇到过类似的问题吗?

mysql锁表的原因是什么

锁表的主要原因是并发事务竞争资源。

独特的锁定机制: 默认情况下,INSERT/UPDATE/DELETE 操作是 X 锁定的。
锁定目标表或行。
继续直到事务提交或回滚。
事务A执行UPDATE表集name='feie',kid=1 2 (kid是非唯一索引)。
Kid值不唯一,因此升级为表锁。
事务 B 尝试修改相同的条件数据,但被阻止。

典型场景: 更新非唯一索引条件: 由于kid值不唯一,导致无法识别行,表锁升级。
Kid值是唯一的,并且锁定目标行而不影响其他行。
时间:2 02 3 -1 0-2 6 位置:数据库 具体数量:kid=1 2
去除重复操作条件: 从表中删除 Kid1 =1 并从表中删除 Kid1 =1 AND Kid2 =2 由于条件范围重叠,后续事务执行将被阻止。
时间:2 02 3 -1 0-2 6 位置:数据库 具体数字:重叠范围
长事务未提交: 事务持有锁的时间太长。
增加其他交易的等待概率。
时间:未知 位置:数据库 具体数字:尚未提交
优化策略: 优化索引设计。
更新/删除条件基于唯一索引。
为经常查询的字段添加唯一索引。
时间:2 02 3 -1 0-2 6 位置:数据库 具体数字:唯一索引
减少交易时间: 减少单次事务操作的数据量。
批量更新分为单独的运行。
优化SQL执行效率,避免全表扫描。
时间:2 02 3 -1 0-2 6 位置:数据库 具体编号: 事业部
统一经营条件: 删除操作使用相同的条件范围。
避免重复条件引起的锁争用。
时间:2 02 3 -1 0-2 6 位置:数据库 具体数字:相同条件
合理选择隔离级别: 调整事务隔离级别。
READ COMMITTED 可以减少幻读引起的锁等待。
时间:2 02 3 -1 0-2 6 位置:数据库 具体数字:READ COMMITTED
表锁是必要的机制,但过多的表锁会影响并发性能。
您可以通过优化索引、缩短事务、确保统一的操作条件来减少表锁的可能性。
提高数据库并发性。

MySQL表碎片问题与性能影响_MySQL碎片整理与优化实战

表碎片会降低 MySQL 的性能。

原因:
DELETE后留一个空格。

INSERT 与间隙不匹配。

更新需要移动数据。

分数判断:
从 information_schema.tables 中选择 data_bebas,其中 table_schema='db'。

显示表状态以查看 Data_free。

高数据空闲表明存在大量碎片(如果>2 0%,请注意)。

解决方案: 1 .重建表:
OPTIMIZEABLE tbl_name(MyISAM 键、InnoDB 短键)。

ALTER TABLE tbl_name ENGINE=InnoDB(完整引擎支持,但已锁定)。

2 在线DDL(MySQL5 .6 +):
pt-online-schema-change(零停机,适合大型表)。

3 逻辑备份恢复:
mysqldump导出、删除表和导入(需要停机)。

4 分布表:
按日期分区,删除分区而不是行(如 PARTITION BY RANGE(YEAR(date)))。

注意事项:
对主键使用自动增量,不要使用 UUID。

批量操作取代单个操作。

定期(例如每月)检查是否有痘痘。

升级MySQL版本(5 .7 +更好)。

使用SSD+ext4 /XFS。

称一下体重。