Add database indexes for discover query performance

This commit is contained in:
Kevin Gatera 2026-02-19 20:11:49 -05:00
parent d2915e689f
commit f1a2e56054

View file

@ -0,0 +1,74 @@
/**
* @typedef MigrationContext
* @property {import('sequelize').QueryInterface} queryInterface
* @property {import('../Logger')} logger
*
* @typedef MigrationOptions
* @property {MigrationContext} context
*/
const migrationVersion = '2.32.2'
const migrationName = `${migrationVersion}-add-discover-query-indexes`
const loggerPrefix = `[${migrationVersion} migration]`
const indexes = [
{
table: 'mediaProgresses',
name: 'media_progress_user_item_finished_time',
fields: ['userId', 'mediaItemId', 'isFinished', 'currentTime']
},
{
table: 'bookSeries',
name: 'book_series_series_book',
fields: ['seriesId', 'bookId']
}
]
async function up({ context: { queryInterface, logger } }) {
logger.info(`${loggerPrefix} UPGRADE BEGIN: ${migrationName}`)
for (const index of indexes) {
await addIndexIfMissing(queryInterface, logger, index)
}
logger.info(`${loggerPrefix} UPGRADE END: ${migrationName}`)
}
async function down({ context: { queryInterface, logger } }) {
logger.info(`${loggerPrefix} DOWNGRADE BEGIN: ${migrationName}`)
for (const index of indexes) {
await removeIndexIfExists(queryInterface, logger, index)
}
logger.info(`${loggerPrefix} DOWNGRADE END: ${migrationName}`)
}
async function addIndexIfMissing(queryInterface, logger, index) {
const existing = await queryInterface.showIndex(index.table)
if (existing.some((i) => i.name === index.name)) {
logger.info(`${loggerPrefix} index ${index.name} already exists on ${index.table}`)
return
}
logger.info(`${loggerPrefix} adding index ${index.name} on ${index.table}(${index.fields.join(', ')})`)
await queryInterface.addIndex(index.table, {
name: index.name,
fields: index.fields
})
logger.info(`${loggerPrefix} added index ${index.name}`)
}
async function removeIndexIfExists(queryInterface, logger, index) {
const existing = await queryInterface.showIndex(index.table)
if (!existing.some((i) => i.name === index.name)) {
logger.info(`${loggerPrefix} index ${index.name} does not exist on ${index.table}`)
return
}
logger.info(`${loggerPrefix} removing index ${index.name}`)
await queryInterface.removeIndex(index.table, index.name)
logger.info(`${loggerPrefix} removed index ${index.name}`)
}
module.exports = { up, down }