Skip to content

Commit f43a71e

Browse files
committed
feat(FOUR-32405): add Database Indexes to Improve Saved Searches Performance
1 parent a517764 commit f43a71e

1 file changed

Lines changed: 101 additions & 0 deletions

File tree

Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,101 @@
1+
<?php
2+
3+
use Illuminate\Database\Migrations\Migration;
4+
use Illuminate\Database\Schema\Blueprint;
5+
use Illuminate\Support\Facades\DB;
6+
use Illuminate\Support\Facades\Schema;
7+
8+
return new class extends Migration {
9+
/**
10+
* Add performance indexes for Saved Search queries.
11+
*/
12+
public function up(): void
13+
{
14+
$this->addIndex(
15+
'process_request_tokens',
16+
'process_request_tokens_prt_task_name_id',
17+
['element_type', 'element_name', 'process_id', 'user_id', 'process_request_id']
18+
);
19+
$this->addIndex(
20+
'process_request_tokens',
21+
'process_request_tokens_prt_type_id_proc',
22+
['element_type', 'process_id', 'user_id', 'process_request_id']
23+
);
24+
$this->addIndex(
25+
'process_request_tokens',
26+
'process_request_tokens_prt_self_service_status_user',
27+
['is_self_service', 'status', 'user_id', 'id']
28+
);
29+
$this->addIndex(
30+
'process_request_tokens',
31+
'process_request_tokens_processid_elem_stat_self_user_elname',
32+
['process_id', 'element_type', 'status', 'is_self_service', 'user_id', 'element_name']
33+
);
34+
35+
$this->addIndex(
36+
'category_assignments',
37+
'category_assignments_assignabletyid_categorytyid',
38+
['assignable_type', 'assignable_id', 'category_type', 'category_id']
39+
);
40+
41+
$this->addIndex(
42+
'process_versions',
43+
'process_versions_processid_draft',
44+
['process_id', 'draft']
45+
);
46+
47+
// Leading `id` removed from the original proposal because the primary key
48+
// already covers it and InnoDB secondary indexes include it automatically.
49+
$this->addIndex(
50+
'processes',
51+
'process_idx_proc_deletedat_categoryid',
52+
['deleted_at', 'process_category_id']
53+
);
54+
55+
// Tail `id` removed for the same reason.
56+
$this->addIndex(
57+
'process_categories',
58+
'process_categories_issystem_id',
59+
['is_system']
60+
);
61+
}
62+
63+
/**
64+
* Reverse the migrations.
65+
*/
66+
public function down(): void
67+
{
68+
$this->dropIndex('process_request_tokens', 'process_request_tokens_prt_task_name_id');
69+
$this->dropIndex('process_request_tokens', 'process_request_tokens_prt_type_id_proc');
70+
$this->dropIndex('process_request_tokens', 'process_request_tokens_prt_self_service_status_user');
71+
$this->dropIndex('process_request_tokens', 'process_request_tokens_processid_elem_stat_self_user_elname');
72+
$this->dropIndex('category_assignments', 'category_assignments_assignabletyid_categorytyid');
73+
$this->dropIndex('process_versions', 'process_versions_processid_draft');
74+
$this->dropIndex('processes', 'process_idx_proc_deletedat_categoryid');
75+
$this->dropIndex('process_categories', 'process_categories_issystem_id');
76+
}
77+
78+
private function addIndex(string $table, string $name, array $columns): void
79+
{
80+
if (Schema::hasIndex($table, $name)) {
81+
return;
82+
}
83+
84+
Schema::table($table, function (Blueprint $table) use ($name, $columns) {
85+
$table->index($columns, $name);
86+
});
87+
}
88+
89+
private function dropIndex(string $table, string $name): void
90+
{
91+
if (!Schema::hasIndex($table, $name)) {
92+
return;
93+
}
94+
95+
try {
96+
DB::statement("ALTER TABLE `{$table}` DROP INDEX `{$name}`");
97+
} catch (Exception $e) {
98+
// Ignore so rollback continues (e.g. index required by a foreign key).
99+
}
100+
}
101+
};

0 commit comments

Comments
 (0)