采纳答案成功!
向帮助你的同学说点啥吧!感谢那些助人为乐的人
这两天看mvcc,大部分网上的说法,都是说数据行有三个隐藏字段,其中有一个是标记数据是否删除的字段,用来实现事务的隔离。难道说mysql在执行delete语句的时候,只是标记了这个删除字段么?那岂不是在长期insert和delete的操作中,数据库文件会无限增大,即使数据很少执行全表扫描也会扫描一遍所有被标记delete的数据
删除的数据的空间会被重用的,所以不会出现无限增大的情况,另外如果是做了批量删除操作,可以通过optimize table命令来回收空间。
mysql是否有自动定期释放回收空间的机制呢?我有一个这样的需求,有一个表,只做insert delete操作,数据不会很多,insert的数据过段时间一定会被处理delete掉,但是我定时会做一个全表扫描。我现在想知道,由于我没有update,相当于插入的永远是新的id的数据,这个空间是否还会被重用?时间久了以后,全表扫描会不会由于被标记Delete的数据过多,导致数据不多,实际扫描的数据是线性增加的?
由于空间会被重用,只要生产的数据量和删除的数据量能保持一致性,实际扫描的数据就只是当前生产的和删除的数据量总和,但如果做了批量删除,说明删除的数据很多,生产的没有跟上删除的,这个时候就需要手动回收下空间了
批量删除回收空间这个我了解,就是说,即便插入的数据id列永远在自增,mysql也会在对新事务都没影响的时候,将新插入的数据覆盖在被标记删除的数据上,是这个意思么?像您说的,批量删除如果不回收空间,此时做全表扫描,会扫描到所有被标记删除的数据么?
登录后可查看更多问答,登录/注册
面面俱到讲解影响MySQL性能的各个因素,让MySQL架构了然于胸。
1.7k 35
1.3k 29
1.1k 17
1.1k 15