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;