From 4ec9c3ea73e6c7f0b81ae5873755bef3b7295521 Mon Sep 17 00:00:00 2001 From: caipira113 Date: Thu, 4 Sep 2025 00:02:53 +0900 Subject: [PATCH 1/2] perf(backend): optimize drive/files query for old root content --- ...756824506000-optimize-drive-files-query.js | 19 +++++++++++++++++++ packages/backend/src/models/DriveFile.ts | 1 + 2 files changed, 20 insertions(+) create mode 100644 packages/backend/migration/1756824506000-optimize-drive-files-query.js diff --git a/packages/backend/migration/1756824506000-optimize-drive-files-query.js b/packages/backend/migration/1756824506000-optimize-drive-files-query.js new file mode 100644 index 0000000000..0716b321fc --- /dev/null +++ b/packages/backend/migration/1756824506000-optimize-drive-files-query.js @@ -0,0 +1,19 @@ +/* + * SPDX-FileCopyrightText: syuilo and misskey-project + * SPDX-License-Identifier: AGPL-3.0-only + */ + +export class OptimizeDriveFilesQuery1756824506000 { + name = 'OptimizeDriveFilesQuery1756824506000' + + async up(queryRunner) { + // Create optimized partial index for drive files query performance + // This index is specifically designed for the common query pattern: + // SELECT * FROM drive_file WHERE userId = ? AND folderId IS NULL ORDER BY id DESC + await queryRunner.query(`CREATE INDEX "IDX_drive_file_userid_null_folderid_id_desc" ON "drive_file" ("userId", ("folderId" IS NULL), "id" DESC)`); + } + + async down(queryRunner) { + await queryRunner.query(`DROP INDEX "IDX_drive_file_userid_null_folderid_id_desc"`); + } +} diff --git a/packages/backend/src/models/DriveFile.ts b/packages/backend/src/models/DriveFile.ts index 7b03e3e494..2bb672ea1c 100644 --- a/packages/backend/src/models/DriveFile.ts +++ b/packages/backend/src/models/DriveFile.ts @@ -10,6 +10,7 @@ import { MiDriveFolder } from './DriveFolder.js'; @Entity('drive_file') @Index(['userId', 'folderId', 'id']) +@Index('IDX_drive_file_userid_null_folderid_id_desc', { synchronize: false }) export class MiDriveFile { @PrimaryColumn(id()) public id: string; From c0b380bbf59961d89f190f9a1f71b30b25605f52 Mon Sep 17 00:00:00 2001 From: caipira113 Date: Thu, 4 Sep 2025 22:31:06 +0900 Subject: [PATCH 2/2] perf(backend): use (userId, id DESC) composite index --- ...756824506000-optimize-drive-files-query.js | 20 +++++++++---------- packages/backend/src/models/DriveFile.ts | 3 +-- 2 files changed, 11 insertions(+), 12 deletions(-) diff --git a/packages/backend/migration/1756824506000-optimize-drive-files-query.js b/packages/backend/migration/1756824506000-optimize-drive-files-query.js index 0716b321fc..e6b72c426e 100644 --- a/packages/backend/migration/1756824506000-optimize-drive-files-query.js +++ b/packages/backend/migration/1756824506000-optimize-drive-files-query.js @@ -4,16 +4,16 @@ */ export class OptimizeDriveFilesQuery1756824506000 { - name = 'OptimizeDriveFilesQuery1756824506000' + name = 'OptimizeDriveFilesQuery1756824506000' - async up(queryRunner) { - // Create optimized partial index for drive files query performance - // This index is specifically designed for the common query pattern: - // SELECT * FROM drive_file WHERE userId = ? AND folderId IS NULL ORDER BY id DESC - await queryRunner.query(`CREATE INDEX "IDX_drive_file_userid_null_folderid_id_desc" ON "drive_file" ("userId", ("folderId" IS NULL), "id" DESC)`); - } + async up(queryRunner) { + // Create optimized composite index for drive files query performance + await queryRunner.query(`DROP INDEX "IDX_860fa6f6c7df5bb887249fba22"`); + await queryRunner.query(`CREATE INDEX "IDX_a76118b66adb3228e0ee69c281" ON "drive_file" ("userId", "id" DESC)`); + } - async down(queryRunner) { - await queryRunner.query(`DROP INDEX "IDX_drive_file_userid_null_folderid_id_desc"`); - } + async down(queryRunner) { + await queryRunner.query(`DROP INDEX "IDX_a76118b66adb3228e0ee69c281"`); + await queryRunner.query(`CREATE INDEX "IDX_860fa6f6c7df5bb887249fba22" ON "drive_file" ("userId")`); + } } diff --git a/packages/backend/src/models/DriveFile.ts b/packages/backend/src/models/DriveFile.ts index 2bb672ea1c..570a327450 100644 --- a/packages/backend/src/models/DriveFile.ts +++ b/packages/backend/src/models/DriveFile.ts @@ -10,12 +10,11 @@ import { MiDriveFolder } from './DriveFolder.js'; @Entity('drive_file') @Index(['userId', 'folderId', 'id']) -@Index('IDX_drive_file_userid_null_folderid_id_desc', { synchronize: false }) +@Index(['userId', 'id']) export class MiDriveFile { @PrimaryColumn(id()) public id: string; - @Index() @Column({ ...id(), nullable: true,