diff --git a/db/post_migrate/20240129175213_create_index_members_on_source_and_type_and_id.rb b/db/post_migrate/20240129175213_create_index_members_on_source_and_type_and_id.rb
new file mode 100644
index 0000000000000000000000000000000000000000..487e1580256030abab481e2adb1c18cd076d5203
--- /dev/null
+++ b/db/post_migrate/20240129175213_create_index_members_on_source_and_type_and_id.rb
@@ -0,0 +1,21 @@
+# frozen_string_literal: true
+
+class CreateIndexMembersOnSourceAndTypeAndId < Gitlab::Database::Migration[2.2]
+  disable_ddl_transaction!
+  milestone '16.9'
+
+  INDEX_NAME = 'index_members_on_source_and_type_and_id'
+
+  def up
+    # This index was created async previously, check https://gitlab.com/gitlab-org/gitlab/-/merge_requests/142719.
+    add_concurrent_index(
+      :members, [:source_id, :source_type, :type, :id],
+      where: 'invite_token IS NULL',
+      name: INDEX_NAME
+    )
+  end
+
+  def down
+    remove_concurrent_index_by_name :members, INDEX_NAME
+  end
+end
diff --git a/db/schema_migrations/20240129175213 b/db/schema_migrations/20240129175213
new file mode 100644
index 0000000000000000000000000000000000000000..5cd3d11bb801ff79e12a7b075b577e70fe9b4b2f
--- /dev/null
+++ b/db/schema_migrations/20240129175213
@@ -0,0 +1 @@
+9892eca1a5ed84b8ba87efe9e1ad740a9359412bc32f6eafc2f705b22f274914
\ No newline at end of file
diff --git a/db/structure.sql b/db/structure.sql
index a8e521109fd262a3a2e90e9a8de4937c51ea4599..f1fc201dfafcc3f6436c5ecb6c3a94f02cf067ae 100644
--- a/db/structure.sql
+++ b/db/structure.sql
@@ -34243,6 +34243,8 @@ CREATE INDEX index_members_on_requested_at ON members USING btree (requested_at)
 
 CREATE INDEX index_members_on_source_and_type_and_access_level ON members USING btree (source_id, source_type, type, access_level);
 
+CREATE INDEX index_members_on_source_and_type_and_id ON members USING btree (source_id, source_type, type, id) WHERE (invite_token IS NULL);
+
 CREATE INDEX index_members_on_source_state_type_access_level_and_user_id ON members USING btree (source_id, source_type, state, type, access_level, user_id) WHERE ((requested_at IS NULL) AND (invite_token IS NULL));
 
 CREATE INDEX index_members_on_user_id_and_access_level_requested_at_is_null ON members USING btree (user_id, access_level) WHERE (requested_at IS NULL);