From 5be478542de392275839a889effc9854370e575d Mon Sep 17 00:00:00 2001 From: Dmitri Date: Thu, 2 Jul 2026 10:46:06 +0200 Subject: [PATCH] Implemented the DB index/query optimization --- ...000001-add-asset-runtime-lookup-indexes.js | 36 +++++++++++++++++++ backend/src/db/models/asset_variants.ts | 7 ++++ backend/src/db/models/assets.ts | 12 +++++++ 3 files changed, 55 insertions(+) create mode 100644 backend/src/db/migrations/20260702000001-add-asset-runtime-lookup-indexes.js diff --git a/backend/src/db/migrations/20260702000001-add-asset-runtime-lookup-indexes.js b/backend/src/db/migrations/20260702000001-add-asset-runtime-lookup-indexes.js new file mode 100644 index 0000000..012da8d --- /dev/null +++ b/backend/src/db/migrations/20260702000001-add-asset-runtime-lookup-indexes.js @@ -0,0 +1,36 @@ +'use strict'; + +/** + * Add indexes for runtime transition asset lookups. + * + * Hot paths: + * - assets lookup by storage_key when resolving transition/reversed videos + * - asset_variants join/filter by assetId and variant_type for reversed variants + */ + +module.exports = { + async up(queryInterface) { + await queryInterface.sequelize.query(` + CREATE INDEX IF NOT EXISTS assets_storage_key_active + ON assets (storage_key) + WHERE "deletedAt" IS NULL + AND storage_key IS NOT NULL + `); + + await queryInterface.sequelize.query(` + CREATE INDEX IF NOT EXISTS asset_variants_asset_id_variant_type_active + ON asset_variants ("assetId", variant_type) + WHERE "deletedAt" IS NULL + `); + }, + + async down(queryInterface) { + await queryInterface.sequelize.query(` + DROP INDEX IF EXISTS asset_variants_asset_id_variant_type_active + `); + + await queryInterface.sequelize.query(` + DROP INDEX IF EXISTS assets_storage_key_active + `); + }, +}; diff --git a/backend/src/db/models/asset_variants.ts b/backend/src/db/models/asset_variants.ts index cfaa674..e3e7a91 100644 --- a/backend/src/db/models/asset_variants.ts +++ b/backend/src/db/models/asset_variants.ts @@ -89,6 +89,13 @@ const defineAssetVariantsModel: SequelizeModelFactory = ( timestamps: true, paranoid: true, freezeTableName: true, + indexes: [ + { + fields: ['assetId', 'variant_type'], + name: 'asset_variants_asset_id_variant_type_active', + where: { deletedAt: null }, + }, + ], }, ); diff --git a/backend/src/db/models/assets.ts b/backend/src/db/models/assets.ts index dafb588..79d9b46 100644 --- a/backend/src/db/models/assets.ts +++ b/backend/src/db/models/assets.ts @@ -1,3 +1,5 @@ +import { Op } from 'sequelize'; + import type { SequelizeModel, SequelizeModelFactory, @@ -133,6 +135,16 @@ const defineAssetsModel: SequelizeModelFactory = (sequelize, DataTypes) => { freezeTableName: true, indexes: [ { fields: ['projectId'] }, + { + fields: ['storage_key'], + name: 'assets_storage_key_active', + where: { + deletedAt: null, + storage_key: { + [Op.ne]: null, + }, + }, + }, { fields: ['asset_type'] }, { fields: ['type'] }, { fields: ['is_public'] },