数据库 删除表原理

来源:互联网 发布:学java去哪儿好 编辑:程序博客网 时间:2024/05/01 09:54

  删除表操作对于使用者来说很简单,但是对于数据库却可能需要做一番复杂的处理,因为表中可能会有大量的数据需要处理,一些商业数据库还会考虑表被误删除需要恢复的问题。

  删除表时清理数据不可能像delete操作那样逐条去删除,通常是基于数据库的体系结构去清理的。例如基于页,块去清理,如果数据库表与文件对应,那么清理数据时可直接删除文件。

  不过,我们似乎忽略了一个问题,相应的表在内存中可能还有数据,这些信息也应当被清理。某些数据库在内存中基于表名称Hash分布数据,这样就可以通过表名称快速定位到该表在内存中的数据,那么清理动作应该会很快。不过某些开源数据库的存储方式并非这样,它在内存中可能是基于一种线性机构来存储的,此时就可能发生问题了。即使在一个数据库中删除一个“空表“,也可能会导致延迟很大。为何?请看下面解释。

  所有的数据库都存在内存命中率的问题,如果内存命中自然就不用访问效率低上百倍的磁盘了,因此对于数据库来说,我们通常会给它配置较大的内存来达到很高的命中率,例如24GB,48GB甚至更大。这意味着如果要找到一个表在内存中Cache的数据有可能需要扫描整个数据区域,在某些时候还不止扫描一个,例如MySQL的InnoDB Buffer若设置非常大,那么在连续删除表时就可能会导致数据库系统性能下降,即使删除整个空表也会导致系统的延迟飙高。

  删除某些数据库的表,为了防止误删除,会在默认的处理删除动作时,只是修改一个名字并将修改后的表名与原来的表名做一个简单的映射,同时也改变其元数据的状态,在默认情况下我们看不见它(就像回收站一样)。但是它依然占用磁盘空间,数据一点不少存在。这样的删除操作自然时瞬间完成的,如果发现删错表了,通过一个简单的语句就可以瞬间恢复。如果想要直接物理删除表或清空回收站,就需要数据库提供特定的操作语法来完成。

0 0
原创粉丝点击