mirror of
https://github.com/basecamp/once-campfire.git
synced 2026-10-07 07:10:10 +09:00
Index messages by room and creation time
Every page of a room's messages (opening the room, scrolling back, the refresh after reconnecting, the bot API) selects WHERE room_id = ? ORDER BY created_at LIMIT 40. With only the room_id index, SQLite reads every message in the room and sorts them in a temporary B-tree to return 40, so these requests grow with the room's history. A composite index on (room_id, created_at) lets SQLite read the 40 rows in order straight from the index. It covers every lookup the room_id index served, so that one goes. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01NuTtwJKhb77Dv7EQqv2C3C
This commit is contained in:
@@ -65,7 +65,30 @@ class MessageTest < ActiveSupport::TestCase
|
||||
assert_equal room.messages.ordered.first(Message::Pagination::PAGE_SIZE).map(&:id), room.messages.first_page.map(&:id)
|
||||
end
|
||||
|
||||
test "pages read a room's messages from an index instead of sorting the whole room" do
|
||||
room, message = rooms(:watercooler), messages(:sixth)
|
||||
statements = capture_message_selects do
|
||||
room.messages.last_page
|
||||
room.messages.page_before(message)
|
||||
room.messages.page_after(message)
|
||||
room.messages.page_created_since(1.day.ago)
|
||||
end
|
||||
|
||||
assert_equal 4, statements.size
|
||||
statements.each do |sql|
|
||||
plan = Message.connection.select_rows("EXPLAIN QUERY PLAN #{sql}").map(&:last).join(" | ")
|
||||
assert_no_match(/TEMP B-TREE/, plan, sql)
|
||||
end
|
||||
end
|
||||
|
||||
private
|
||||
def capture_message_selects(&block)
|
||||
statements = []
|
||||
callback = ->(*, payload) { statements << payload[:sql] if payload[:sql].start_with?(%(SELECT "messages")) }
|
||||
ActiveSupport::Notifications.subscribed(callback, "sql.active_record", &block)
|
||||
statements
|
||||
end
|
||||
|
||||
def create_new_message_in(room)
|
||||
room.messages.create!(creator: users(:jason), body: "Hello", client_message_id: "123")
|
||||
end
|
||||
|
||||
Reference in New Issue
Block a user