diff --git a/db/post_migrate/20230914054914_index_finding_id_for_vulnerabilities_sync.rb b/db/post_migrate/20230914054914_index_finding_id_for_vulnerabilities_sync.rb
new file mode 100644
index 0000000000000000000000000000000000000000..37cd13a4dfa81354b13febcd0bb7e4bbbd63c306
--- /dev/null
+++ b/db/post_migrate/20230914054914_index_finding_id_for_vulnerabilities_sync.rb
@@ -0,0 +1,15 @@
+# frozen_string_literal: true
+
+class IndexFindingIdForVulnerabilitiesSync < Gitlab::Database::Migration[2.1]
+  INDEX_NAME = 'index_vulnerabilities_on_finding_id'
+
+  disable_ddl_transaction!
+
+  def up
+    add_concurrent_index :vulnerabilities, :finding_id, name: INDEX_NAME
+  end
+
+  def down
+    remove_concurrent_index_by_name :vulnerabilities, INDEX_NAME
+  end
+end
diff --git a/db/schema_migrations/20230914054914 b/db/schema_migrations/20230914054914
new file mode 100644
index 0000000000000000000000000000000000000000..c5cc5595ce68a1341cd000776b2d148ea4ce7c13
--- /dev/null
+++ b/db/schema_migrations/20230914054914
@@ -0,0 +1 @@
+9702393eb6db18d5d3d106c0a77c21419af828fe5a422dd5c06a2621ef10cf03
\ No newline at end of file
diff --git a/db/structure.sql b/db/structure.sql
index b66130e90c2d9f5b34c6430c7dfc1d1bc4ca3b7a..628c8609159fdfd854c202e580aa9a32f883fc6c 100644
--- a/db/structure.sql
+++ b/db/structure.sql
@@ -34162,6 +34162,8 @@ CREATE INDEX index_vulnerabilities_on_due_date_sourcing_milestone_id ON vulnerab
 
 CREATE INDEX index_vulnerabilities_on_epic_id ON vulnerabilities USING btree (epic_id);
 
+CREATE INDEX index_vulnerabilities_on_finding_id ON vulnerabilities USING btree (finding_id);
+
 CREATE INDEX index_vulnerabilities_on_last_edited_by_id ON vulnerabilities USING btree (last_edited_by_id);
 
 CREATE INDEX index_vulnerabilities_on_milestone_id ON vulnerabilities USING btree (milestone_id);
diff --git a/ee/spec/models/ee/vulnerability_spec.rb b/ee/spec/models/ee/vulnerability_spec.rb
index 244c70ffa1718f2064fa02cc69321a3fc50eb311..5dd0e36c5305e6842874ed5cbd72963c33f7a8b2 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('3ddf9cf697cf69f0d621d6d0a789ca0ccb497d255a7f48549afdd601a0a5a694').reference('https://gitlab.com/gitlab-org/gitlab/-/issues/349315') }
+  it { is_expected.to have_locked_schema('bd611bb22d07b989340d2b982d0f7503907c87102ee02513285900637e53a584').reference('https://gitlab.com/gitlab-org/gitlab/-/issues/349315') }
 
   it_behaves_like 'vulnerability and finding shared examples' do
     let(:transformer_method) { :itself }
diff --git a/spec/db/schema_spec.rb b/spec/db/schema_spec.rb
index 04a83a1f6ab7d4020d9587b0f638804a9563580e..fbd9c4d32ccadff62b0674209af1e33490048d92 100644
--- a/spec/db/schema_spec.rb
+++ b/spec/db/schema_spec.rb
@@ -14,8 +14,7 @@
     # but in Search::NamespaceIndexAssignment model, only `search_index_id` is used as foreign key and indexed
     search_namespace_index_assignments: [%w[search_index_id index_type]],
     slack_integrations_scopes: [%w[slack_api_scope_id]],
-    notes: %w[namespace_id], # this index is added in an async manner, hence it needs to be ignored in the first phase.
-    vulnerabilities: [%w[finding_id]] # index will be created in https://gitlab.com/gitlab-org/gitlab/-/issues/423541
+    notes: %w[namespace_id] # this index is added in an async manner, hence it needs to be ignored in the first phase.
   }.with_indifferent_access.freeze
 
   TABLE_PARTITIONS = %w[ci_builds_metadata].freeze