]> git.mxchange.org Git - friendica.git/commitdiff
Issue 14947: Database performance improvements
authorMichael <heluecht@pirati.ca>
Sun, 15 Jun 2025 15:59:40 +0000 (15:59 +0000)
committerMichael <heluecht@pirati.ca>
Sun, 15 Jun 2025 16:04:51 +0000 (16:04 +0000)
src/Database/Database.php
src/Worker/ExpirePosts.php

index 88aa636fd34ff6c11bebc61dcc110b3eb8d62e8a..c037a3198bf32ba603f745fdbd3bf0dac06c6a5b 100644 (file)
@@ -1722,19 +1722,35 @@ class Database
         */
        public function processlist(): array
        {
+               $database = trim($this->config->get('database', 'database'));
+
                $ret  = $this->p('SHOW PROCESSLIST');
                $data = $this->toArray($ret);
 
                $processes = 0;
+               $max_time  = 0;
+               $max_query = '';
                $states    = [];
                foreach ($data as $process) {
-                       $state = trim($process['State']);
+                       if ($process['db'] != $database) {
+                               continue;
+                       }
 
                        // Filter out all non blocking processes
-                       if (!in_array($state, ['', 'init', 'statistics', 'updating'])) {
-                               ++$states[$state];
-                               ++$processes;
+                       $state = trim($process['State']);
+                       if (in_array($state, ['', 'init', 'statistics', 'updating'])) {
+                               continue;
+                       }
+
+                       if ($process['Time'] > $max_time) {
+                               $max_time  = $process['Time'];
+                               $max_query = $process['Info'];
+                       }
+                       if (!isset($states[$state])) {
+                               $states[$state] = 0;
                        }
+                       ++$states[$state];
+                       ++$processes;
                }
 
                $statelist = '';
@@ -1744,7 +1760,7 @@ class Database
                        }
                        $statelist .= $state . ': ' . $usage;
                }
-               return (['list' => $statelist, 'amount' => $processes]);
+               return (['list' => $statelist, 'amount' => $processes, 'states' => $states, 'max_time' => $max_time, 'max_query' => $max_query]);
        }
 
        /**
index e4c1b231d6df400890c528d430fb6b213367a014..a8f77348ca0af4fc4928aa4104e4b0709faa27ec 100644 (file)
@@ -34,6 +34,13 @@ class ExpirePosts
                        return;
                }
 
+               $processlist = DBA::processlist();
+               if ($processlist['max_time'] > 60) {
+                       DI::logger()->warning('Processlist shows a long running query, task will be deferred.', ['time' => $processlist['max_time'], 'query' => $processlist['max_query']]);
+                       Worker::defer();
+                       return;
+               }
+
                DI::logger()->notice('Expire posts - Delete expired origin posts');
                self::deleteExpiredOriginPosts();
 
@@ -133,7 +140,7 @@ class ExpirePosts
                DI::logger()->notice('Adding missing entries');
 
                $rows      = 0;
-               $userposts = DBA::select('post-user', [], ["`uri-id` not in (select `uri-id` from `post`)"]);
+               $userposts = DBA::p("SELECT `post-user`.* FROM `post-user` LEFT JOIN `post` ON `post`.`uri-id` = `post-user`.`uri-id` WHERE `post`.`uri-id` IS NULL");
                while ($fields = DBA::fetch($userposts)) {
                        $post_fields = DI::dbaDefinition()->truncateFieldsForTable('post', $fields);
                        DBA::insert('post', $post_fields, Database::INSERT_IGNORE);