You are here

node_delete VS node_delete_multiple 性能改进

我想做一个删除操作,批量的删除操作,使用VBO,这个是比较简单的,运行VBO的删除操作,即可实现。

但是我遇到一个问题,我的节点数量巨大,有6万多个节点,按照VBO的效率,我感觉需要执行2-3个小时,其实这个没有什么。晚上下班的时候,让程序运行,第二天回来就搞定了。

不过我是在下午运行的,运行完了,还要做别的事情,所以我试用了自己以前写的batch delete模块,运行。还是比较慢。

我个人感觉删除,还是一个比较快的操作,不需要这么长的时间。我分析了一下原因,这是我最初的代码:
$query =db_select('node', 'n')
->fields('n', array('nid'))
->condition('n.type', $types, 'IN')
->range(0, $size);
$result = $query->execute();
foreach ($result as $record) {
//drupal_set_message('123max:'.$record->nid);
node_delete($record->nid);
$context['sandbox']['progress']++;
//$context['message'] = t('删除节点 %nid',array('%nid' => $node['nid']));
}
把一次删除一个节点,替换成100个节点同时删除,这个时候,可以使用node_delete_multiple,我查了一下API,将代码修改为:
$query =db_select('node', 'n')
->fields('n', array('nid'))
->condition('n.type', $types, 'IN')
->range(0, $size);
$result = $query->execute();
$nid_array = array();
foreach ($result as $record) {
//drupal_set_message('123max:'.$record->nid);
//node_delete($record->nid);
$nid_array[] = $record->nid;
$context['sandbox']['progress']++;
//$context['message'] = t('删除节点 %nid',array('%nid' => $node['nid']));
}
node_delete_multiple($nid_array);
程序运行的速度一下子快了很多,半个小时就能搞定的样子。执行100次node_delete,一次删除一个节点,与执行一次node_delete_multiple,一次删除100个节点,功能是一样的,性能不一样,差距很大。在千个级别,两者没有什么差别,但是数据量大的时候,差别就大了。

论坛:

Drupal版本: