enhance(backend): DB note (userId) インデクス -> (userId, id) 複合インデクスにする (#15879)

* enhance(backend): use composite index for ordering notes by user

Signed-off-by: eternal-flame-AD <yume@yumechi.jp>

* fixup! enhance(backend): use composite index for ordering notes by user

---------

Signed-off-by: eternal-flame-AD <yume@yumechi.jp>
This commit is contained in:
饺子w (Yumechi) 2025-04-23 05:29:42 +00:00 committed by GitHub
parent 0a604285a0
commit 7a41cfe28b
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 23 additions and 1 deletions

View file

@ -0,0 +1,21 @@
/*
* SPDX-FileCopyrightText: syuilo and misskey-project
* SPDX-License-Identifier: AGPL-3.0-only
*/
export class CompositeNoteIndex1745378064470 {
name = 'CompositeNoteIndex1745378064470';
async up(queryRunner) {
await queryRunner.query(`CREATE INDEX "IDX_724b311e6f883751f261ebe378" ON "note" ("userId", "id" DESC)`);
await queryRunner.query(`DROP INDEX IF EXISTS "IDX_5b87d9d19127bd5d92026017a7"`);
// Flush all cached Linear Scan Plans and redo statistics for composite 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 "user", "note"`);
}
async down(queryRunner) {
await queryRunner.query(`DROP INDEX IF EXISTS "IDX_724b311e6f883751f261ebe378"`);
await queryRunner.query(`CREATE INDEX "IDX_5b87d9d19127bd5d92026017a7" ON "note" ("userId")`);
}
}

View file

@ -10,6 +10,7 @@ import { MiUser } from './User.js';
import { MiChannel } from './Channel.js';
import type { MiDriveFile } from './DriveFile.js';
@Index(['userId', 'id'])
@Entity('note')
export class MiNote {
@PrimaryColumn(id())
@ -65,7 +66,6 @@ export class MiNote {
})
public cw: string | null;
@Index()
@Column({
...id(),
comment: 'The ID of author.',