diff --git a/modules/taxonomy/taxonomy.install b/modules/taxonomy/taxonomy.install
index e3603e1..ebd0084 100644
--- a/modules/taxonomy/taxonomy.install
+++ b/modules/taxonomy/taxonomy.install
@@ -903,13 +903,34 @@ function taxonomy_update_7010() {
 /**
  * Drop unpublished nodes from the index.
  */
-function taxonomy_update_7011() {
-  $nids = db_query('SELECT nid from {node} WHERE status = :status', array(':status' => NODE_NOT_PUBLISHED))->fetchCol();
+function taxonomy_update_7011(&$sandbox) {
+  // Initialize information needed by the batch update system.
+  if (!isset($sandbox['progress'])) {
+    $sandbox['progress'] = 0;
+    $sandbox['max'] = db_query('SELECT COUNT(DISTINCT n.nid) FROM {node} n INNER JOIN {taxonomy_index} t ON n.nid = t.nid WHERE n.status = :status', array(':status' => NODE_NOT_PUBLISHED))->fetchField();
+    // If there's no data, don't bother with the extra work.
+    if (empty($sandbox['max'])) {
+      return;
+    }
+  }
+
+  // Process records in groups of 5000.
+  $limit = 5000;
+  $nids = db_query_range('SELECT DISTINCT n.nid FROM {node} n INNER JOIN {taxonomy_index} t ON n.nid = t.nid WHERE n.status = :status', 0, $limit, array(':status' => NODE_NOT_PUBLISHED))->fetchCol();
   if (!empty($nids)) {
     db_delete('taxonomy_index')
       ->condition('nid', $nids)
       ->execute();
   }
+
+  // Update our progress information for the batch update.
+  $sandbox['progress'] += $limit;
+
+  // Indicate our current progress to the batch update system, if the update is
+  // not yet complete.
+  if ($sandbox['progress'] < $sandbox['max']) {
+    $sandbox['#finished'] = $sandbox['progress'] / $sandbox['max'];
+  }
 }
 
 /**
