From 8ac9d991f62c434661f71133fd9db23ee6b267ca Mon Sep 17 00:00:00 2001 From: Aaron Kimbrell Date: Sat, 26 Sep 2026 19:01:16 -0500 Subject: [PATCH] perf(migrations): index map_events_daily by day Its key starts with the zone, so the economy compaction read the whole table twice for every day it merged into a month. With 900k old rows to merge on MariaDB the task went from 107 s to 14 s. The index holds only the day and the key, so the game's upsert that adds to a row's events never updates it. Co-Authored-By: Claude Opus 5.5 --- migrations/dlu/mysql/75_map_events_day_index.sql | 4 ++++ migrations/dlu/sqlite/58_map_events_day_index.sql | 2 ++ 2 files changed, 6 insertions(+) create mode 100644 migrations/dlu/mysql/75_map_events_day_index.sql create mode 100644 migrations/dlu/sqlite/58_map_events_day_index.sql diff --git a/migrations/dlu/mysql/75_map_events_day_index.sql b/migrations/dlu/mysql/75_map_events_day_index.sql new file mode 100644 index 000000000..9a9c1260b --- /dev/null +++ b/migrations/dlu/mysql/75_map_events_day_index.sql @@ -0,0 +1,4 @@ +/* map_events_daily's key starts with the zone, so everything that reads it by day alone read the whole table: the + economy compaction (twice per day it merges into a month, a whole table scan each) and the reports over every zone. + The index holds only the day and the key, so adding events to a row (the game's upsert) never has to update it. */ +CREATE INDEX map_events_daily_day ON map_events_daily (day); diff --git a/migrations/dlu/sqlite/58_map_events_day_index.sql b/migrations/dlu/sqlite/58_map_events_day_index.sql new file mode 100644 index 000000000..54dfc0c99 --- /dev/null +++ b/migrations/dlu/sqlite/58_map_events_day_index.sql @@ -0,0 +1,2 @@ +/* map_events_daily by day, for the economy compaction and the reports over every zone: see the MySQL migration */ +CREATE INDEX IF NOT EXISTS map_events_daily_day ON map_events_daily (day);