关于Mysql的InnoDB引擎在长期添加和删除情况下引起的性能问题

场景一:

公司的大数据平台,每天都会从别的节点中同步数据到某个表中,同时这个表要进行大量的删除添加

问题:在这个表只有2W多条数据的时候,使用一个count(*)语句,数据查询花费了近10秒

原因:MySQL的InnoDB引擎执行delete语句的时候,只是逻辑删除而不是物理删除,它将数据标记为已删除,并不会在磁盘中真正删除,尽管InnoDB引擎在查询的时候会跳过已删除的行,但是仍然需要进行大量的扫描,因为数据量很大(几千万条),同时这也会产生磁盘的碎片化问题

为什么磁盘文件碎片化会影响磁盘的查询性能

一:增加磁盘的寻道时间

  •  碎片化会导致数据在磁盘上存储不连续,使得读取的时候需要进行大量的寻道操作。
  •  寻道时间是磁盘读取的逐渐瓶颈之一

二:数据块的大小

  • 操作系统在读取数据的时候通常是按块(或者扇区)的大小进行读取(Linux是4KB,MySQL是16KB)
  • 碎片化会导致数据分散在不同的数据块中,从而增加了读取的数据块数量,降低了读取效率(假如数据1 2 3 4,如果 1 2 3 4在同一数据块中,那么操作系统一次性将这个数据块读取操CPU缓存中,如果要获取某个数据可以直接从缓存中拿取,如果有碎片化,那么可能 1 2 在一个数据块中, 3 4 在同一个数据块中,只读取了第一个数据块,如果要读取4这个数据,那么还需要再读取数据)

解决办法:

在要清空这个表格的时候,不要使用delete语句进行删除

使用        关键字TRUNCATE TABLE xxxxx来进行删除

这个关键字会立即删除表中的所有数据,使表回到初始状态,就像新建一张没有任何记录的空表一样(同时保留索引等信息)

同时,它比逐行删除数据更快,尤其适用于数据量很大的表。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值