diff --git a/spacetimedb/src/tables.rs b/spacetimedb/src/tables.rs index d2a2ea5..aa7f7e6 100644 --- a/spacetimedb/src/tables.rs +++ b/spacetimedb/src/tables.rs @@ -180,7 +180,7 @@ pub struct Reaction { pub custom_emoji_id: Option, } -#[spacetimedb::table(accessor = message)] +#[spacetimedb::table(accessor = message, index(accessor = channel_seq, btree(columns = [channel_id, seq_id])))] #[derive(Clone)] pub struct Message { #[primary_key] diff --git a/spacetimedb/src/views.rs b/spacetimedb/src/views.rs index e08f7d9..e4ed773 100644 --- a/spacetimedb/src/views.rs +++ b/spacetimedb/src/views.rs @@ -81,16 +81,14 @@ pub fn visible_recent_activity(ctx: &ViewContext) -> Vec { let limit = get_recent_message_limit_read_only(&ctx.db); let min_seq = if last_seq_id > limit { last_seq_id - (limit - 1) } else { 1 }; - for msg in ctx.db.message().channel_id().filter(access.channel_id) { - if msg.seq_id >= min_seq { - results.push(msg.clone()); - } + // HIGH PERFORMANCE: Uses composite index range scan + for msg in ctx.db.message().channel_seq().filter((access.channel_id, min_seq..)) { + results.push(msg.clone()); } } results } - #[spacetimedb::view(accessor = visible_servers, public)] pub fn visible_servers(ctx: &ViewContext) -> Vec { let identity = ctx.sender();