影响:
- 产生
大量碎片
,影响磁盘IO; - 另外会影响索引的基数
Cardinality
值,从而导致关联sql时使用不当的索引; - 如果数据库拓扑中有做主从同步,一次性delete大量数据,会出现
主从同步延迟
。
首先要了解下,对mysql进行删除数据操作,磁盘空间并不会立即被回收,这里的空间包括数据和索引空间,但是可能被后续的insert利用,也可能不会,就形成碎片。
怎么测试删除数据mysql没有立即回收空间呢?
很简单,首先创建一个innodb表tb,往里插入大量数据(比如10w条),这个时候看下tb的数据文件tb.ibd的大小,记录下来;此时再把tb表数据删除(delete from tb
),然后再看下tb.ibd的大小,会发现没有变化,也就是没被回收!
当然更关注的是怎么解决。
问题1、2都可以通过执行OPTIMIZE TABLE 表名
来优化表,重新组织表数据和关联索引数据的物理存储。(执行完再去看看.ibd的大小是不是变小了)
主从同步延迟的问题则是按照上面说的,分批间隔几分钟删除,把大事务化成小事务去执行。
最后再说下,这种迁移数据到另外一张表,然后删除大表数据,叫做MySQL归档
,随便搜下就有,给个传送门MySQL大表数据归档的几种方法介绍
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…