从数据库中删除数据(使用实际的delete SQL查询)是否会在重新索引表数据(比方说数千万数据)时造成巨大的问题,从而增加系统开销并消耗更多的资源?
发布于 2018-08-06 18:43:48
大多数数据库不会立即从表中删除与已删除行关联的索引节点。根据如何处理重复索引键的细节,这可能根本没有影响。例如,构建重复键索引的一种方案是对键值只有一个B+Tree节点,但使其指向在索引列中包含该键值的行列表。在这种情况下,删除表中的一行甚至许多行根本不会影响索引树的效率,直到具有该键值的所有行都被删除,此时键节点将被标记为已删除,但不一定从树中删除。当然,在使用唯一索引键的情况下,任何删除操作都将导致节点被标记为已删除。当磁盘上的许多键值彼此接近时,索引树可能会变得效率低下。
一种解决方案是从头开始重新构建索引,方法是删除索引并重新创建它,或者如果DBMS具有此功能,则使用“reindex”命令。一些更高级的数据库系统使用的另一种解决方案是每当索引的搜索实际遇到已删除的节点时进行跟踪。如果这种情况经常发生,以至于超过了配置的阈值,那么自动线程将“清理”索引,实际上删除了删除的节点,并可能压缩大部分空的索引页,甚至重新平衡索引树。这种“清理线程”特性的优点是,不经常使用的低效索引,或者包含已删除节点的索引的子树不再被访问(想象一下,删除索引中的过期行,其前导列是用于清除行的日期),不占用资源来清理或重新构建它们,因为它们不会影响性能。
https://stackoverflow.com/questions/51705703
复制相似问题