diff --git a/include/class.cron.php b/include/class.cron.php
index 3aa0357c198ce61e25a22dae6bc9ea982954877e..390ff0769117001d0714cd9f9874da74ada59b90 100644
--- a/include/class.cron.php
+++ b/include/class.cron.php
@@ -32,7 +32,9 @@ class Cron {
 
     function PurgeLogs() {
         global $ost;
-        if($ost) $ost->purgeLogs();
+        // Once a day on a 5-minute cron
+        if (rand(1,300) == 42)
+            if($ost) $ost->purgeLogs();
     }
 
     function PurgeDrafts() {
@@ -45,6 +47,47 @@ class Cron {
         AttachmentFile::deleteOrphans();
     }
 
+    function MaybeOptimizeTables() {
+        // Once a week on a 5-minute cron
+        $chance = rand(1,2000);
+        switch ($chance) {
+        case 42:
+            @db_query('OPTIMIZE TABLE '.TICKET_LOCK_TABLE);
+            break;
+        case 242:
+            @db_query('OPTIMIZE TABLE '.SYSLOG_TABLE);
+            break;
+        case 442:
+            @db_query('OPTIMIZE TABLE '.DRAFT_TABLE);
+            break;
+
+        // Start optimizing core ticket tables when we have an archiving
+        // system available
+        case 142:
+            #@db_query('OPTIMIZE TABLE '.TICKET_TABLE);
+            break;
+        case 542:
+            #@db_query('OPTIMIZE TABLE '.FORM_ENTRY_TABLE);
+            break;
+        case 642:
+            #@db_query('OPTIMIZE TABLE '.FORM_ANSWER_TABLE);
+            break;
+        case 342:
+            #@db_query('OPTIMIZE TABLE '.FILE_TABLE);
+            # XXX: Please do not add an OPTIMIZE for the file_chunk table!
+            break;
+
+        // Start optimizing user tables when we have a user directory
+        // sporting deletes
+        case 742:
+            #@db_query('OPTIMIZE TABLE '.USER_TABLE);
+            break;
+        case 842:
+            #@db_query('OPTIMIZE TABLE '.USER_EMAIL_TABLE);
+            break;
+        }
+    }
+
     function run(){ //called by outside cron NOT autocron
         global $ost;
         if (!$ost || $ost->isUpgradePending())
@@ -55,6 +98,7 @@ class Cron {
         self::PurgeLogs();
         self::CleanOrphanedFiles();
         self::PurgeDrafts();
+        self::MaybeOptimizeTables();
     }
 }
 ?>
diff --git a/include/class.lock.php b/include/class.lock.php
index bbf53b5498451c8ab6e3660282898fa3f4318eb4..d6bcbad9dc66105803fbb49a267252d068423242 100644
--- a/include/class.lock.php
+++ b/include/class.lock.php
@@ -147,11 +147,10 @@ class TicketLock {
         return db_query($sql);
     }
 
-    //Called  via cron 
+    //Called  via cron
     function cleanup() {
         //Cleanup any expired locks.
         db_query('DELETE FROM '.TICKET_LOCK_TABLE.' WHERE expire<NOW()');
-        @db_query('OPTIMIZE TABLE '.TICKET_LOCK_TABLE);
     }
 }
 ?>