diff --git a/simplex-chat.cabal b/simplex-chat.cabal index 38e02cfd18..1b33bad7b6 100644 --- a/simplex-chat.cabal +++ b/simplex-chat.cabal @@ -168,6 +168,7 @@ library Simplex.Chat.Store.Postgres.Migrations.M20260915_user_badges Simplex.Chat.Store.Postgres.Migrations.M20260918_badge_issue_errors Simplex.Chat.Store.Postgres.Migrations.M20260923_preferences_json + Simplex.Chat.Store.Postgres.Migrations.M20260926_member_role_index else exposed-modules: Simplex.Chat.Archive @@ -345,6 +346,7 @@ library Simplex.Chat.Store.SQLite.Migrations.M20260915_user_badges Simplex.Chat.Store.SQLite.Migrations.M20260918_badge_issue_errors Simplex.Chat.Store.SQLite.Migrations.M20260923_preferences_json + Simplex.Chat.Store.SQLite.Migrations.M20260926_member_role_index other-modules: Paths_simplex_chat hs-source-dirs: diff --git a/src/Simplex/Chat/Store/Postgres/Migrations.hs b/src/Simplex/Chat/Store/Postgres/Migrations.hs index 24ed45c9a9..a6f03cf964 100644 --- a/src/Simplex/Chat/Store/Postgres/Migrations.hs +++ b/src/Simplex/Chat/Store/Postgres/Migrations.hs @@ -53,6 +53,7 @@ import Simplex.Chat.Store.Postgres.Migrations.M20260904_file_badges import Simplex.Chat.Store.Postgres.Migrations.M20260915_user_badges import Simplex.Chat.Store.Postgres.Migrations.M20260918_badge_issue_errors import Simplex.Chat.Store.Postgres.Migrations.M20260923_preferences_json +import Simplex.Chat.Store.Postgres.Migrations.M20260926_member_role_index import Simplex.Messaging.Agent.Store.Shared (Migration (..)) schemaMigrations :: [(String, Text, Maybe Text)] @@ -105,7 +106,8 @@ schemaMigrations = ("20260904_file_badges", m20260904_file_badges, Just down_m20260904_file_badges), ("20260915_user_badges", m20260915_user_badges, Just down_m20260915_user_badges), ("20260918_badge_issue_errors", m20260918_badge_issue_errors, Just down_m20260918_badge_issue_errors), - ("20260923_preferences_json", m20260923_preferences_json, Just down_m20260923_preferences_json) + ("20260923_preferences_json", m20260923_preferences_json, Just down_m20260923_preferences_json), + ("20260926_member_role_index", m20260926_member_role_index, Just down_m20260926_member_role_index) ] -- | The list of migrations in ascending order by date diff --git a/src/Simplex/Chat/Store/Postgres/Migrations/M20260926_member_role_index.hs b/src/Simplex/Chat/Store/Postgres/Migrations/M20260926_member_role_index.hs new file mode 100644 index 0000000000..159f25ea50 --- /dev/null +++ b/src/Simplex/Chat/Store/Postgres/Migrations/M20260926_member_role_index.hs @@ -0,0 +1,21 @@ +{-# LANGUAGE OverloadedStrings #-} +{-# LANGUAGE QuasiQuotes #-} + +module Simplex.Chat.Store.Postgres.Migrations.M20260926_member_role_index where + +import Data.Text (Text) +import Text.RawString.QQ (r) + +m20260926_member_role_index :: Text +m20260926_member_role_index = + [r| +CREATE INDEX idx_group_members_group_id_member_role ON group_members(user_id, group_id, member_role); +DROP INDEX idx_group_members_group_id; +|] + +down_m20260926_member_role_index :: Text +down_m20260926_member_role_index = + [r| +CREATE INDEX idx_group_members_group_id ON group_members(user_id, group_id); +DROP INDEX idx_group_members_group_id_member_role; +|] diff --git a/src/Simplex/Chat/Store/Postgres/Migrations/chat_schema.sql b/src/Simplex/Chat/Store/Postgres/Migrations/chat_schema.sql index ad975874db..122d77fb97 100644 --- a/src/Simplex/Chat/Store/Postgres/Migrations/chat_schema.sql +++ b/src/Simplex/Chat/Store/Postgres/Migrations/chat_schema.sql @@ -2672,14 +2672,14 @@ CREATE INDEX idx_group_members_contact_profile_id ON test_chat_schema.group_memb -CREATE INDEX idx_group_members_group_id ON test_chat_schema.group_members USING btree (user_id, group_id); - - - CREATE UNIQUE INDEX idx_group_members_group_id_index_in_group ON test_chat_schema.group_members USING btree (group_id, index_in_group); +CREATE INDEX idx_group_members_group_id_member_role ON test_chat_schema.group_members USING btree (user_id, group_id, member_role); + + + CREATE INDEX idx_group_members_invited_by ON test_chat_schema.group_members USING btree (invited_by); diff --git a/src/Simplex/Chat/Store/SQLite/Migrations.hs b/src/Simplex/Chat/Store/SQLite/Migrations.hs index 4dcefa1598..35fa3c0887 100644 --- a/src/Simplex/Chat/Store/SQLite/Migrations.hs +++ b/src/Simplex/Chat/Store/SQLite/Migrations.hs @@ -176,6 +176,7 @@ import Simplex.Chat.Store.SQLite.Migrations.M20260904_file_badges import Simplex.Chat.Store.SQLite.Migrations.M20260915_user_badges import Simplex.Chat.Store.SQLite.Migrations.M20260918_badge_issue_errors import Simplex.Chat.Store.SQLite.Migrations.M20260923_preferences_json +import Simplex.Chat.Store.SQLite.Migrations.M20260926_member_role_index import Simplex.Messaging.Agent.Store.Shared (Migration (..)) schemaMigrations :: [(String, Query, Maybe Query)] @@ -351,7 +352,8 @@ schemaMigrations = ("20260904_file_badges", m20260904_file_badges, Just down_m20260904_file_badges), ("20260915_user_badges", m20260915_user_badges, Just down_m20260915_user_badges), ("20260918_badge_issue_errors", m20260918_badge_issue_errors, Just down_m20260918_badge_issue_errors), - ("20260923_preferences_json", m20260923_preferences_json, Just down_m20260923_preferences_json) + ("20260923_preferences_json", m20260923_preferences_json, Just down_m20260923_preferences_json), + ("20260926_member_role_index", m20260926_member_role_index, Just down_m20260926_member_role_index) ] -- | The list of migrations in ascending order by date diff --git a/src/Simplex/Chat/Store/SQLite/Migrations/M20260926_member_role_index.hs b/src/Simplex/Chat/Store/SQLite/Migrations/M20260926_member_role_index.hs new file mode 100644 index 0000000000..e835b47987 --- /dev/null +++ b/src/Simplex/Chat/Store/SQLite/Migrations/M20260926_member_role_index.hs @@ -0,0 +1,20 @@ +{-# LANGUAGE QuasiQuotes #-} + +module Simplex.Chat.Store.SQLite.Migrations.M20260926_member_role_index where + +import Database.SQLite.Simple (Query) +import Database.SQLite.Simple.QQ (sql) + +m20260926_member_role_index :: Query +m20260926_member_role_index = + [sql| +CREATE INDEX idx_group_members_group_id_member_role ON group_members(user_id, group_id, member_role); +DROP INDEX idx_group_members_group_id; +|] + +down_m20260926_member_role_index :: Query +down_m20260926_member_role_index = + [sql| +CREATE INDEX idx_group_members_group_id ON group_members(user_id, group_id); +DROP INDEX idx_group_members_group_id_member_role; +|] diff --git a/src/Simplex/Chat/Store/SQLite/Migrations/chat_query_plans.txt b/src/Simplex/Chat/Store/SQLite/Migrations/chat_query_plans.txt index 152d6c0c8d..212c2b247e 100644 --- a/src/Simplex/Chat/Store/SQLite/Migrations/chat_query_plans.txt +++ b/src/Simplex/Chat/Store/SQLite/Migrations/chat_query_plans.txt @@ -5891,7 +5891,7 @@ Query: ) Plan: -SEARCH m USING INDEX idx_group_members_group_id (user_id=? AND group_id=?) +SEARCH m USING INDEX idx_group_members_group_id_member_role (user_id=? AND group_id=?) LIST SUBQUERY 1 SCAN chat_items USING COVERING INDEX idx_chat_items_group_member_id SEARCH p USING INTEGER PRIMARY KEY (rowid=?) @@ -6074,7 +6074,7 @@ Query: LEFT JOIN connections c ON c.group_member_id = m.group_member_id WHERE m.user_id = ? AND m.group_id = ? AND (m.contact_id IS NULL OR m.contact_id != ?) Plan: -SEARCH m USING INDEX idx_group_members_group_id (user_id=? AND group_id=?) +SEARCH m USING INDEX idx_group_members_group_id_member_role (user_id=? AND group_id=?) SEARCH p USING INTEGER PRIMARY KEY (rowid=?) SEARCH c USING INDEX idx_connections_group_member_id (group_member_id=?) LEFT-JOIN @@ -6094,7 +6094,7 @@ Query: LEFT JOIN connections c ON c.group_member_id = m.group_member_id WHERE m.user_id = ? AND m.group_id = ? AND (m.contact_id IS NULL OR m.contact_id != ?) AND m.member_role = ? Plan: -SEARCH m USING INDEX idx_group_members_group_id (user_id=? AND group_id=?) +SEARCH m USING INDEX idx_group_members_group_id_member_role (user_id=? AND group_id=? AND member_role=?) SEARCH p USING INTEGER PRIMARY KEY (rowid=?) SEARCH c USING INDEX idx_connections_group_member_id (group_member_id=?) LEFT-JOIN @@ -6114,7 +6114,7 @@ Query: LEFT JOIN connections c ON c.group_member_id = m.group_member_id WHERE m.user_id = ? AND m.group_id = ? AND (m.contact_id IS NULL OR m.contact_id != ?) AND m.member_role IN (?,?) Plan: -SEARCH m USING INDEX idx_group_members_group_id (user_id=? AND group_id=?) +SEARCH m USING INDEX idx_group_members_group_id_member_role (user_id=? AND group_id=? AND member_role=?) SEARCH p USING INTEGER PRIMARY KEY (rowid=?) SEARCH c USING INDEX idx_connections_group_member_id (group_member_id=?) LEFT-JOIN @@ -6134,7 +6134,7 @@ Query: LEFT JOIN connections c ON c.group_member_id = m.group_member_id WHERE m.user_id = ? AND m.group_id = ? AND (m.contact_id IS NULL OR m.contact_id != ?) AND m.member_role IN (?,?,?) Plan: -SEARCH m USING INDEX idx_group_members_group_id (user_id=? AND group_id=?) +SEARCH m USING INDEX idx_group_members_group_id_member_role (user_id=? AND group_id=? AND member_role=?) SEARCH p USING INTEGER PRIMARY KEY (rowid=?) SEARCH c USING INDEX idx_connections_group_member_id (group_member_id=?) LEFT-JOIN @@ -6154,7 +6154,7 @@ Query: LEFT JOIN connections c ON c.group_member_id = m.group_member_id WHERE m.user_id = ? AND m.group_id = ? AND m.contact_id IS DISTINCT FROM ? AND m.member_role = ? Plan: -SEARCH m USING INDEX idx_group_members_group_id (user_id=? AND group_id=?) +SEARCH m USING INDEX idx_group_members_group_id_member_role (user_id=? AND group_id=? AND member_role=?) SEARCH p USING INTEGER PRIMARY KEY (rowid=?) SEARCH c USING INDEX idx_connections_group_member_id (group_member_id=?) LEFT-JOIN @@ -6923,7 +6923,7 @@ SEARCH contacts USING COVERING INDEX idx_contacts_contact_group_member_id (conta Query: DELETE FROM group_members WHERE user_id = ? AND group_id = ? Plan: -SEARCH group_members USING COVERING INDEX idx_group_members_group_id (user_id=? AND group_id=?) +SEARCH group_members USING COVERING INDEX idx_group_members_group_id_member_role (user_id=? AND group_id=?) SEARCH rcv_roster_transfers USING COVERING INDEX idx_rcv_roster_transfers_from_member_id (from_member_id=?) SEARCH group_relays USING COVERING INDEX idx_group_relays_group_member_id (group_member_id=?) SEARCH delivery_jobs USING COVERING INDEX idx_delivery_jobs_job_scope_support_gm_id (job_scope_support_gm_id=?) @@ -7574,11 +7574,11 @@ SEARCH group_members USING INDEX idx_group_members_user_id (user_id=?) Query: SELECT group_member_id FROM group_members WHERE user_id = ? AND group_id = ? AND local_display_name = ? Plan: -SEARCH group_members USING INDEX idx_group_members_group_id (user_id=? AND group_id=?) +SEARCH group_members USING INDEX idx_group_members_group_id_member_role (user_id=? AND group_id=?) Query: SELECT group_member_id FROM group_members WHERE user_id = ? AND group_id = ? AND member_category = ? Plan: -SEARCH group_members USING INDEX idx_group_members_group_id (user_id=? AND group_id=?) +SEARCH group_members USING INDEX idx_group_members_group_id_member_role (user_id=? AND group_id=?) Query: SELECT group_member_id, member_category FROM group_members WHERE user_id = ? AND group_id = ? AND member_id = ? Plan: diff --git a/src/Simplex/Chat/Store/SQLite/Migrations/chat_schema.sql b/src/Simplex/Chat/Store/SQLite/Migrations/chat_schema.sql index 995497d5ee..eab54e29de 100644 --- a/src/Simplex/Chat/Store/SQLite/Migrations/chat_schema.sql +++ b/src/Simplex/Chat/Store/SQLite/Migrations/chat_schema.sql @@ -1117,7 +1117,6 @@ CREATE INDEX idx_chat_items_timed_delete_at ON chat_items( user_id, timed_delete_at ); -CREATE INDEX idx_group_members_group_id ON group_members(user_id, group_id); CREATE INDEX idx_chat_item_moderations_group_id ON chat_item_moderations( group_id ); @@ -1576,3 +1575,8 @@ BEGIN ) WHERE group_id = NEW.group_id; END; +CREATE INDEX idx_group_members_group_id_member_role ON group_members( + user_id, + group_id, + member_role +);