From d92e6fc75cfe595dcbfbdca439b0f9bd2fcf3eb2 Mon Sep 17 00:00:00 2001 From: Brandon Thomas Date: Fri, 3 Jul 2026 03:55:53 -0400 Subject: [PATCH] add index to media_files to aid lookups (#1727) --- .../down.sql | 7 +++++++ .../up.sql | 17 +++++++++++++++++ .../sql/migrations_squashed/media_files.sql | 3 ++- 3 files changed, 26 insertions(+), 1 deletion(-) create mode 100644 _database/sql/migrations/2026-07-03-074740-0000_alter_media_files_add_user_created_at_index/down.sql create mode 100644 _database/sql/migrations/2026-07-03-074740-0000_alter_media_files_add_user_created_at_index/up.sql diff --git a/_database/sql/migrations/2026-07-03-074740-0000_alter_media_files_add_user_created_at_index/down.sql b/_database/sql/migrations/2026-07-03-074740-0000_alter_media_files_add_user_created_at_index/down.sql new file mode 100644 index 0000000000..2deab1e07c --- /dev/null +++ b/_database/sql/migrations/2026-07-03-074740-0000_alter_media_files_add_user_created_at_index/down.sql @@ -0,0 +1,7 @@ +-- noinspection SqlDialectInspectionForFile +-- noinspection SqlNoDataSourceInspectionForFile +-- noinspection SqlResolveForFile + +ALTER TABLE media_files + DROP INDEX idx_creator_created_at, + ALGORITHM=INPLACE, LOCK=NONE; diff --git a/_database/sql/migrations/2026-07-03-074740-0000_alter_media_files_add_user_created_at_index/up.sql b/_database/sql/migrations/2026-07-03-074740-0000_alter_media_files_add_user_created_at_index/up.sql new file mode 100644 index 0000000000..bbdb33e21b --- /dev/null +++ b/_database/sql/migrations/2026-07-03-074740-0000_alter_media_files_add_user_created_at_index/up.sql @@ -0,0 +1,17 @@ +-- noinspection SqlDialectInspectionForFile +-- noinspection SqlNoDataSourceInspectionForFile +-- noinspection SqlResolveForFile + +-- Composite index for the library / user profile list queries: +-- WHERE maybe_creator_user_token = ? ... ORDER BY created_at DESC LIMIT n +-- +-- Without this, the optimizer picks an index-merge intersection against huge +-- low-selectivity indexes (e.g. index_user_deleted_at, ~4.75M NULL entries), +-- scanning millions of index records per page load. +-- +-- NB: ADD INDEX is online DDL (ALGORITHM=INPLACE, LOCK=NONE) — reads and writes +-- continue during the build. Expect a few minutes of elevated I/O on a table +-- this size (~8.5M rows). +ALTER TABLE media_files + ADD INDEX idx_creator_created_at (maybe_creator_user_token, created_at), + ALGORITHM=INPLACE, LOCK=NONE; diff --git a/_database/sql/migrations_squashed/media_files.sql b/_database/sql/migrations_squashed/media_files.sql index 843eacf9b9..24494d8637 100644 --- a/_database/sql/migrations_squashed/media_files.sql +++ b/_database/sql/migrations_squashed/media_files.sql @@ -364,6 +364,7 @@ CREATE TABLE media_files ( KEY index_user_deleted_at (user_deleted_at), KEY index_mod_deleted_at (mod_deleted_at), KEY index_media_files_created_at (created_at), - KEY index_media_files_updated_at (updated_at) + KEY index_media_files_updated_at (updated_at), + KEY idx_creator_created_at (maybe_creator_user_token, created_at) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;