From 566f92ab735b489e660bda1ded6106673ab1d892 Mon Sep 17 00:00:00 2001 From: Hazelnoot Date: Sat, 24 May 2025 18:28:07 -0400 Subject: [PATCH] add IDX_instance_host_key --- ...48104955717-index_IDX_instance_host_key.js | 20 +++++++++++++++++++ packages/backend/src/models/Instance.ts | 1 + 2 files changed, 21 insertions(+) create mode 100644 packages/backend/migration/1748104955717-index_IDX_instance_host_key.js diff --git a/packages/backend/migration/1748104955717-index_IDX_instance_host_key.js b/packages/backend/migration/1748104955717-index_IDX_instance_host_key.js new file mode 100644 index 0000000000..3c3b779298 --- /dev/null +++ b/packages/backend/migration/1748104955717-index_IDX_instance_host_key.js @@ -0,0 +1,20 @@ +/* + * SPDX-FileCopyrightText: hazelnoot and other Sharkey contributors + * SPDX-License-Identifier: AGPL-3.0-only + */ + +export class IndexIDXInstanceHostKey1748104955717 { + name = 'IndexIDXInstanceHostKey1748104955717' + + async up(queryRunner) { + await queryRunner.query(`CREATE UNIQUE INDEX "IDX_instance_host_key" ON "instance" (((lower(reverse("host")) || '.')::text) text_pattern_ops)`); + + // Flush all cached Linear Scan Plans and redo statistics for expression index + // this is important for Postgres to learn that even in highly complex queries, using this index first can reduce the result set significantly + await queryRunner.query(`ANALYZE "instance"`); + } + + async down(queryRunner) { + await queryRunner.query(`DROP INDEX "IDX_instance_host_key"`); + } +} diff --git a/packages/backend/src/models/Instance.ts b/packages/backend/src/models/Instance.ts index c64ebb1b3b..5d8108d423 100644 --- a/packages/backend/src/models/Instance.ts +++ b/packages/backend/src/models/Instance.ts @@ -6,6 +6,7 @@ import { Entity, PrimaryColumn, Index, Column } from 'typeorm'; import { id } from './util/id.js'; +@Index('IDX_instance_host_key', { synchronize: false }) @Entity('instance') export class MiInstance { @PrimaryColumn(id())