diff --git a/db/post_migrate/20231206142250_sync_create_supporting_index_for_finding_id_backfill.rb b/db/post_migrate/20231206142250_sync_create_supporting_index_for_finding_id_backfill.rb
new file mode 100644
index 0000000000000000000000000000000000000000..1371674a8d91fe9ced679f329fdca6061dcf3c50
--- /dev/null
+++ b/db/post_migrate/20231206142250_sync_create_supporting_index_for_finding_id_backfill.rb
@@ -0,0 +1,25 @@
+# frozen_string_literal: true
+
+class SyncCreateSupportingIndexForFindingIdBackfill < Gitlab::Database::Migration[2.2]
+  milestone '16.7'
+
+  disable_ddl_transaction!
+
+  INDEX_NAME = "tmp_index_vulnerabilities_on_id_finding_id_empty"
+
+  def up
+    add_concurrent_index(
+      :vulnerabilities,
+      :id,
+      where: "finding_id IS NULL",
+      name: INDEX_NAME
+    )
+  end
+
+  def down
+    remove_concurrent_index_by_name(
+      :vulnerabilities,
+      INDEX_NAME
+    )
+  end
+end
diff --git a/db/schema_migrations/20231206142250 b/db/schema_migrations/20231206142250
new file mode 100644
index 0000000000000000000000000000000000000000..547e11e29fd267966464e3f39d66fcfb711b8902
--- /dev/null
+++ b/db/schema_migrations/20231206142250
@@ -0,0 +1 @@
+4d8f16d926fc141a72a9d25f200dfe345f3bb4cff3cd8c71f4b4792df445119c
\ No newline at end of file
diff --git a/db/structure.sql b/db/structure.sql
index a6a80d9e7732c1d05d4af49a6af0bd6e866aec9a..da8c21bff1dcc8ad8b82f3cfa15ce18c7c84ed61 100644
--- a/db/structure.sql
+++ b/db/structure.sql
@@ -35335,6 +35335,8 @@ CREATE INDEX tmp_index_project_statistics_cont_registry_size ON project_statisti
 
 CREATE INDEX tmp_index_project_statistics_updated_at ON project_statistics USING btree (project_id, updated_at) WHERE (repository_size > 0);
 
+CREATE INDEX tmp_index_vulnerabilities_on_id_finding_id_empty ON vulnerabilities USING btree (id) WHERE (finding_id IS NULL);
+
 CREATE INDEX tmp_index_vulnerability_dismissal_info ON vulnerabilities USING btree (id) WHERE ((state = 2) AND ((dismissed_at IS NULL) OR (dismissed_by_id IS NULL)));
 
 CREATE INDEX tmp_index_vulnerability_overlong_title_html ON vulnerabilities USING btree (id) WHERE (length(title_html) > 800);
diff --git a/ee/spec/models/ee/vulnerability_spec.rb b/ee/spec/models/ee/vulnerability_spec.rb
index 9628a8698aa072facdbcc2b9f19265809bb54665..a985c46b5935e104e4c34a955dd2971d3113e998 100644
--- a/ee/spec/models/ee/vulnerability_spec.rb
+++ b/ee/spec/models/ee/vulnerability_spec.rb
@@ -29,7 +29,7 @@
   let_it_be(:vulnerability) { create(:vulnerability, :sast, :confirmed, :low, :with_state_transition, project: project) }
   let_it_be(:finding) { create(:vulnerabilities_finding, vulnerability: vulnerability) }
 
-  it { is_expected.to have_locked_schema('5a36734541ebab0070a5f5e2b67761be8522357d175a0c7a43aaacedf9603f7c').reference('https://gitlab.com/gitlab-org/gitlab/-/issues/349315') }
+  it { is_expected.to have_locked_schema('acd1e63fcaaeba6f545d3420da5f3407914227b57ff584bb98b5c3f2e0411877').reference('https://gitlab.com/gitlab-org/gitlab/-/issues/349315') }
 
   it_behaves_like 'vulnerability and finding shared examples' do
     let(:transformer_method) { :itself }