summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMark Felder <feld@feld.me>2023-04-22 16:14:56 +0000
committerMark Felder <feld@feld.me>2023-04-22 16:43:33 +0000
commitd91a823836f416dc0bdf0fe8527695d372dcb347 (patch)
treee09bf90ddc8cc3e585764bba5603ef1454ef36ca
parent3867b52aefdab5c26bcd4f58155b1370ee40e4dd (diff)
Remove unused indexesunused_indexes
These indexes were always listed as unused and several grow quite large. The most significant impact is the activities_visibility_index which takes many hours to rebuild when restoring the server from backup even on fast hardware.
-rw-r--r--priv/repo/migrations/20230422154018_drop_unused_indexes.exs88
1 files changed, 88 insertions, 0 deletions
diff --git a/priv/repo/migrations/20230422154018_drop_unused_indexes.exs b/priv/repo/migrations/20230422154018_drop_unused_indexes.exs
new file mode 100644
index 000000000..f2ba6b8df
--- /dev/null
+++ b/priv/repo/migrations/20230422154018_drop_unused_indexes.exs
@@ -0,0 +1,88 @@
+defmodule Pleroma.Repo.Migrations.DropUnusedIndexes do
+ use Ecto.Migration
+
+ @disable_ddl_transaction true
+ @disable_migration_lock true
+
+ def up do
+ drop_if_exists(
+ index(:activities, ["(data->>'actor')", "inserted_at desc"], name: :activities_actor_index)
+ )
+
+ drop_if_exists(index(:activities, ["(data->'to')"], name: :activities_to_index))
+
+ drop_if_exists(index(:activities, ["(data->'cc')"], name: :activities_cc_index))
+
+ drop_if_exists(index(:activities, ["(split_part(actor, '/', 3))"], name: :activities_hosts))
+
+ drop_if_exists(
+ index(:activities, ["(data->'object'->>'inReplyTo')"], name: :activities_in_reply_to)
+ )
+
+ drop_if_exists(
+ index(:activities, ["((data #> '{\"object\",\"likes\"}'))"], name: :activities_likes)
+ )
+
+ drop_if_exists(
+ index(:activities, ["activity_visibility(actor, recipients, data)", "id DESC NULLS LAST"],
+ name: :activities_visibility_index,
+ where: "data->>'type' = 'Create'"
+ )
+ )
+ end
+
+ def down do
+ create_if_not_exists(
+ index(:activities, ["(data->>'actor')", "inserted_at desc"],
+ name: :activities_actor_index,
+ concurrently: true
+ )
+ )
+
+ create_if_not_exists(
+ index(:activities, ["(data->'to')"],
+ name: :activities_to_index,
+ using: :gin,
+ concurrently: true
+ )
+ )
+
+ create_if_not_exists(
+ index(:activities, ["(data->'cc')"],
+ name: :activities_cc_index,
+ using: :gin,
+ concurrently: true
+ )
+ )
+
+ create_if_not_exists(
+ index(:activities, ["(split_part(actor, '/', 3))"],
+ name: :activities_hosts,
+ concurrently: true
+ )
+ )
+
+ create_if_not_exists(
+ index(:activities, ["(data->'object'->>'inReplyTo')"],
+ name: :activities_in_reply_to,
+ concurrently: true
+ )
+ )
+
+ create_if_not_exists(
+ index(:activities, ["((data #> '{\"object\",\"likes\"}'))"],
+ name: :activities_likes,
+ using: :gin,
+ concurrently: true
+ )
+ )
+
+ create_if_not_exists(
+ index(:activities, ["activity_visibility(actor, recipients, data)", "id DESC NULLS LAST"],
+ name: :activities_visibility_index,
+ where: "data->>'type' = 'Create'",
+ concurrently: true
+ )
+ )
+ end
+end