Delete search index entries in batches
authorMatthias Schmidt <gravatronics@live.com>
Sat, 22 Jun 2019 12:10:04 +0000 (14:10 +0200)
committerMatthias Schmidt <gravatronics@live.com>
Sat, 22 Jun 2019 12:10:04 +0000 (14:10 +0200)
wcfsetup/install/files/lib/system/search/mysql/MysqlSearchIndexManager.class.php

index 52fa1d485a4f48bae56aa1b3a65b63c00a914b34..b160a89c42c0e0f685f695e033d395d3e99558c2 100644 (file)
@@ -44,12 +44,20 @@ class MysqlSearchIndexManager extends AbstractSearchIndexManager {
         * @inheritDoc
         */
        public function delete($objectType, array $objectIDs) {
-               $sql = "DELETE FROM     " . SearchIndexManager::getTableName($objectType) . "
-                       WHERE           objectID = ?";
-               $statement = WCF::getDB()->prepareStatement($sql);
+               // instead of executing one query per object id, execute queries
+               // for batches of up to 1000 object ids at once
+               $itemsPerLoop = 1000;
+               $batchCount = ceil(count($objectIDs) / $itemsPerLoop);
+               $tableName = SearchIndexManager::getTableName($objectType);
+               
                WCF::getDB()->beginTransaction();
-               foreach ($objectIDs as $objectID) {
-                       $statement->execute([$objectID]);
+               for ($i = 0; $i < $batchCount; $i++) {
+                       $batchObjectIDs = array_slice($objectIDs, $i * $itemsPerLoop, $itemsPerLoop);
+                       
+                       $sql = "DELETE FROM     " . $tableName . "
+                               WHERE           objectID IN (?" . str_repeat(', ?', count($batchObjectIDs) - 1) . ")";
+                       $statement = WCF::getDB()->prepareStatement($sql);
+                       $statement->execute($batchObjectIDs);
                }
                WCF::getDB()->commitTransaction();
        }