【发布时间】:2013-10-13 20:09:57
【问题描述】:
我有一个包含超过 250000 个要删除的节点的内容类型。通过查看批量操作删除需要很长时间(2 天以上)并且会出现错误。有没有更快的方法可以直接通过数据库执行此操作。因此,例如,我可以只清空数据库中包含该内容类型中的字段的所有表。我觉得删除它们的速度会快 100 倍,但它会导致我的网站直接从数据库中删除吗?
【问题讨论】:
标签: mysql drupal drupal-7 nodes
我有一个包含超过 250000 个要删除的节点的内容类型。通过查看批量操作删除需要很长时间(2 天以上)并且会出现错误。有没有更快的方法可以直接通过数据库执行此操作。因此,例如,我可以只清空数据库中包含该内容类型中的字段的所有表。我觉得删除它们的速度会快 100 倍,但它会导致我的网站直接从数据库中删除吗?
【问题讨论】:
标签: mysql drupal drupal-7 nodes
激活Devel 模块的查询日志功能。删除一个节点。查看为要删除的节点执行了哪些查询。这应该可以让您很好地了解删除节点需要做什么,包括由钩子执行的查询。
您可能还想查看node_delete_multiple() 以了解在删除节点期间执行了哪些其他操作(例如重建搜索索引)。
要了解存在哪些相关挂钩实现,您可以破解 module_invoke_all() 以记录对 hook_node_delete 和 hook_entity_delete 的调用,并检查它们是否执行除了执行数据库查询之外的其他任务。
有了这些信息,您可以编写一个 PHP 脚本或Drush 命令,它比多次调用node_delete_multiple() 更有效地删除多个节点。尤其是不需要进行引导 Drupal(或者至少不需要那么频繁)。
另一方面,仅在前 50 个相关节点上调用 node_delete_multiple() 直到所有相关节点都消失的 Drush 命令实施起来更快。可能值得接受增加的处理时间以节省开发时间。
【讨论】: