From 9f17fbe69727857997b97a03b47344507b0b5c13 Mon Sep 17 00:00:00 2001 From: Shivam Mishra Date: Tue, 30 Jun 2026 15:25:00 +0530 Subject: [PATCH] feat: add index for stats perf --- ...00_add_sender_created_index_to_messages.rb | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 db/migrate/20260630000000_add_sender_created_index_to_messages.rb diff --git a/db/migrate/20260630000000_add_sender_created_index_to_messages.rb b/db/migrate/20260630000000_add_sender_created_index_to_messages.rb new file mode 100644 index 000000000..7be9c036e --- /dev/null +++ b/db/migrate/20260630000000_add_sender_created_index_to_messages.rb @@ -0,0 +1,22 @@ +class AddSenderCreatedIndexToMessages < ActiveRecord::Migration[7.1] + disable_ddl_transaction! + + # Adds created_at to the (sender_type, sender_id) index so per-assistant + # windowed lookups (Captain Overview stats) can range-scan the time slice + # instead of reading every lifetime row and filtering at the heap. The new + # index is a left-prefix superset of the old one, so the old one is dropped + # to keep write amplification on `messages` neutral. + def up + add_index :messages, [:sender_type, :sender_id, :created_at], + name: 'index_messages_on_sender_and_created', algorithm: :concurrently + remove_index :messages, name: 'index_messages_on_sender_type_and_sender_id', + algorithm: :concurrently, if_exists: true + end + + def down + add_index :messages, [:sender_type, :sender_id], + name: 'index_messages_on_sender_type_and_sender_id', algorithm: :concurrently + remove_index :messages, name: 'index_messages_on_sender_and_created', + algorithm: :concurrently, if_exists: true + end +end