听说MySQL频繁的删除数据会影响性能,请问原理是什么? 能影响到什么程度?

听说MySQL频繁的删除数据会影响性能,请问原理是什么? 能影响到什么程度?

我有一个2千万数据的表A,最近想拆分一下.

  1. 将一部分数据从表A复制到表B,同时从表A中删掉该部分数据.
  2. 今后每日从表A中搬运一部分数据到表B

之前听说这种高频度的删除操作极其影响MySQL的性能, 真的吗?请问原理是什么?能影响到什么程度? 怎么避开?

阅读 457
评论
    4 个回答
    • 1.4k

    影响:

    1. 产生大量碎片,影响磁盘IO;
    2. 另外会影响索引的基数Cardinality值,从而导致关联sql时使用不当的索引;
    3. 如果数据库拓扑中有做主从同步,一次性delete大量数据,会出现主从同步延迟

    首先要了解下,对mysql进行删除数据操作,磁盘空间并不会立即被回收,这里的空间包括数据和索引空间,但是可能被后续的insert利用,也可能不会,就形成碎片。

    怎么测试删除数据mysql没有立即回收空间呢?
    很简单,首先创建一个innodb表tb,往里插入大量数据(比如10w条),这个时候看下tb的数据文件tb.ibd的大小,记录下来;此时再把tb表数据删除(delete from tb),然后再看下tb.ibd的大小,会发现没有变化,也就是没被回收!

    当然更关注的是怎么解决。
    问题1、2都可以通过执行OPTIMIZE TABLE 表名来优化表,重新组织表数据和关联索引数据的物理存储。(执行完再去看看.ibd的大小是不是变小了)
    主从同步延迟的问题则是按照上面说的,分批间隔几分钟删除,把大事务化成小事务去执行。

    最后再说下,这种迁移数据到另外一张表,然后删除大表数据,叫做MySQL归档,随便搜下就有,给个传送门MySQL大表数据归档的几种方法介绍

      相似问题
      推荐文章