From: Michael Date: Sun, 15 Jun 2025 15:59:40 +0000 (+0000) Subject: Issue 14947: Database performance improvements X-Git-Url: https://git.mxchange.org/?a=commitdiff_plain;h=943741e2e7a1641bd1d075f538a0194c2c197235;p=friendica.git Issue 14947: Database performance improvements --- diff --git a/src/Database/Database.php b/src/Database/Database.php index 88aa636fd3..c037a3198b 100644 --- a/src/Database/Database.php +++ b/src/Database/Database.php @@ -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]); } /** diff --git a/src/Worker/ExpirePosts.php b/src/Worker/ExpirePosts.php index e4c1b231d6..a8f77348ca 100644 --- a/src/Worker/ExpirePosts.php +++ b/src/Worker/ExpirePosts.php @@ -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);