From 86b0edd8f2c7785bf7127e9a2841877f84d98960 Mon Sep 17 00:00:00 2001 From: Wes Copeland Date: Fri, 3 Jan 2025 08:33:04 -0500 Subject: [PATCH] perf(feed): speed up slow query --- .../Actions/BuildDeveloperFeedDataAction.php | 21 +++++-------------- 1 file changed, 5 insertions(+), 16 deletions(-) diff --git a/app/Community/Actions/BuildDeveloperFeedDataAction.php b/app/Community/Actions/BuildDeveloperFeedDataAction.php index fc1c3409a5..ab75d8827d 100644 --- a/app/Community/Actions/BuildDeveloperFeedDataAction.php +++ b/app/Community/Actions/BuildDeveloperFeedDataAction.php @@ -170,23 +170,12 @@ function ($join) { */ private function getRecentLeaderboardEntries(User $targetUser): array { - $thirtyDaysAgo = Carbon::now()->subDays(30); - - // Using FORCE INDEX in MySQL/MariaDB dramatically improves performance (from ~550ms to ~20ms). - // We conditionally apply the hint only when using MySQL/MariaDB. It is not supported by SQLite. - $query = LeaderboardEntry::query(); - - if (DB::connection()->getDriverName() === 'mariadb') { - $query->from(DB::raw('leaderboard_entries FORCE INDEX (idx_recent_entries)')); - } - - return $query - ->with(['leaderboard', 'leaderboard.game', 'leaderboard.game.system', 'user']) - ->join('LeaderboardDef', 'LeaderboardDef.ID', '=', 'leaderboard_entries.leaderboard_id') - ->where('LeaderboardDef.author_id', $targetUser->id) + return LeaderboardEntry::select('leaderboard_entries.*') + ->with(['leaderboard.game.system', 'user']) + ->join('LeaderboardDef as ld', 'ld.ID', '=', 'leaderboard_entries.leaderboard_id') + ->where('ld.author_id', $targetUser->id) ->whereNull('leaderboard_entries.deleted_at') - ->where('leaderboard_entries.updated_at', '>=', $thirtyDaysAgo) - ->select('leaderboard_entries.*') + ->where('leaderboard_entries.updated_at', '>=', now()->subDays(30)) ->orderBy('leaderboard_entries.updated_at', 'desc') ->take(200) ->get()