fix: Add composite index on messages for csat_metrics API performance (#11831)
This PR adds a composite index (:account_id, :content_type, :created_at) on the table messages. This index is added as a temporary fix for performance issues in the CSAT responses controller where we query messages with account_id, content_type and created_at. The current implementation (account.message.input_csat.count) times out with millions of messages. TODO: Create a dedicated csat_survey table and add entries when surveys are sent, then query this table instead of the entire messages table for better performance.
This commit is contained in:
parent
b7f3f72b9c
commit
eea1ab3002
@ -24,6 +24,7 @@
|
|||||||
#
|
#
|
||||||
# Indexes
|
# Indexes
|
||||||
#
|
#
|
||||||
|
# idx_messages_account_content_created (account_id,content_type,created_at)
|
||||||
# index_messages_on_account_created_type (account_id,created_at,message_type)
|
# index_messages_on_account_created_type (account_id,created_at,message_type)
|
||||||
# index_messages_on_account_id (account_id)
|
# index_messages_on_account_id (account_id)
|
||||||
# index_messages_on_account_id_and_inbox_id (account_id,inbox_id)
|
# index_messages_on_account_id_and_inbox_id (account_id,inbox_id)
|
||||||
|
|||||||
20
db/migrate/20250627195529_add_index_to_messages.rb
Normal file
20
db/migrate/20250627195529_add_index_to_messages.rb
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
class AddIndexToMessages < ActiveRecord::Migration[7.0]
|
||||||
|
def change
|
||||||
|
# This index is added as a temporary fix for performance issues in the CSAT
|
||||||
|
# responses controller where we query messages with account_id, content_type
|
||||||
|
# and created_at. The current implementation (account.message.input_csat.count)
|
||||||
|
# times out with millions of messages.
|
||||||
|
#
|
||||||
|
# TODO: Create a dedicated csat_survey table and add entries when surveys are
|
||||||
|
# sent, then query this table instead of the entire messages table for better
|
||||||
|
# performance.
|
||||||
|
return if index_exists?(
|
||||||
|
:messages,
|
||||||
|
[:account_id, :content_type, :created_at],
|
||||||
|
name: 'idx_messages_account_content_created'
|
||||||
|
)
|
||||||
|
|
||||||
|
add_index :messages, [:account_id, :content_type, :created_at],
|
||||||
|
name: 'idx_messages_account_content_created', algorithm: :concurrently
|
||||||
|
end
|
||||||
|
end
|
||||||
@ -10,7 +10,7 @@
|
|||||||
#
|
#
|
||||||
# It's strongly recommended that you check this file into your version control system.
|
# It's strongly recommended that you check this file into your version control system.
|
||||||
|
|
||||||
ActiveRecord::Schema[7.1].define(version: 2025_06_20_120000) do
|
ActiveRecord::Schema[7.1].define(version: 2025_06_27_195529) do
|
||||||
# These extensions should be enabled to support this database
|
# These extensions should be enabled to support this database
|
||||||
enable_extension "pg_stat_statements"
|
enable_extension "pg_stat_statements"
|
||||||
enable_extension "pg_trgm"
|
enable_extension "pg_trgm"
|
||||||
@ -825,6 +825,7 @@ ActiveRecord::Schema[7.1].define(version: 2025_06_20_120000) do
|
|||||||
t.text "processed_message_content"
|
t.text "processed_message_content"
|
||||||
t.jsonb "sentiment", default: {}
|
t.jsonb "sentiment", default: {}
|
||||||
t.index "((additional_attributes -> 'campaign_id'::text))", name: "index_messages_on_additional_attributes_campaign_id", using: :gin
|
t.index "((additional_attributes -> 'campaign_id'::text))", name: "index_messages_on_additional_attributes_campaign_id", using: :gin
|
||||||
|
t.index ["account_id", "content_type", "created_at"], name: "idx_messages_account_content_created"
|
||||||
t.index ["account_id", "created_at", "message_type"], name: "index_messages_on_account_created_type"
|
t.index ["account_id", "created_at", "message_type"], name: "index_messages_on_account_created_type"
|
||||||
t.index ["account_id", "inbox_id"], name: "index_messages_on_account_id_and_inbox_id"
|
t.index ["account_id", "inbox_id"], name: "index_messages_on_account_id_and_inbox_id"
|
||||||
t.index ["account_id"], name: "index_messages_on_account_id"
|
t.index ["account_id"], name: "index_messages_on_account_id"
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user