diff --git a/CHANGELOG b/CHANGELOG
index 09f2c44e02cda58d86b5c2890126070ca0c819f0..f6fb9b7d2570806ed68eb08bbd5d3ae45f6cbe19 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -45,6 +45,7 @@ v 8.10.0 (unreleased)
   - RailsCache metris now includes fetch_hit/fetch_miss and read_hit/read_miss info.
   - Allow [ci skip] to be in any case and allow [skip ci]. !4785 (simon_w)
   - Set import_url validation to be more strict
+  - Memoize MR merged/closed events retrieval
   - Add basic system information like memory and disk usage to the admin panel
   - Don't garbage collect commits that have related DB records like comments
   - More descriptive message for git hooks and file locks
diff --git a/app/models/merge_request.rb b/app/models/merge_request.rb
index 083e93f1ee7596414f326dec40e6607e4be05c9b..393d8a7265796752d0b2d1aa472ce40ec0f49f8a 100644
--- a/app/models/merge_request.rb
+++ b/app/models/merge_request.rb
@@ -318,11 +318,11 @@ def check_if_can_be_merged
   end
 
   def merge_event
-    self.target_project.events.where(target_id: self.id, target_type: "MergeRequest", action: Event::MERGED).last
+    @merge_event ||= target_project.events.where(target_id: self.id, target_type: "MergeRequest", action: Event::MERGED).last
   end
 
   def closed_event
-    self.target_project.events.where(target_id: self.id, target_type: "MergeRequest", action: Event::CLOSED).last
+    @closed_event ||= target_project.events.where(target_id: self.id, target_type: "MergeRequest", action: Event::CLOSED).last
   end
 
   WIP_REGEX = /\A\s*(\[WIP\]\s*|WIP:\s*|WIP\s+)+\s*/i.freeze