summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStan Hu <stanhu@gmail.com>2018-03-06 13:30:10 -0800
committerStan Hu <stanhu@gmail.com>2018-03-07 21:39:20 -0800
commit609a434c6dc2c6d4aafb359348c129fc01d264e3 (patch)
tree260d371bd3e6b82edbc0c87704b5a59ad65f76ce
parent7734e85bc6592c5ad3330c611c5f83a051b680b0 (diff)
downloadgitlab-ce-sh-add-missing-acts-as-taggable-indices.tar.gz
Adding missing indexes on taggings tablesh-add-missing-acts-as-taggable-indices
API requests were timing out because `tag_id` was missing an index. These migrations were imported by running https://github.com/mbleigh/acts-as-taggable-on#post-installation: ``` bundle exec rake acts_as_taggable_on_engine:install:migrations ``` It looks like the `acts-as-tagglable` gem added the indexes in v4.0.0, but when we upgraded from v3.5.0 (back in 2016 via f571aeb5ce38dce1a9e5f58d76360836d4a8f8a0) we did not add them. On staging, there are about 10.7 million rows on the `taggings` table. It took about 30 seconds for each index to be created. On production, there are about 17.4 million rows, so I suspect the time to be about a minute per index. Closes #43927
-rw-r--r--changelogs/unreleased/sh-add-missing-acts-as-taggable-indices.yml5
-rw-r--r--db/migrate/20180306134842_add_missing_indexes_acts_as_taggable_on_engine.rb21
-rw-r--r--db/schema.rb2
3 files changed, 28 insertions, 0 deletions
diff --git a/changelogs/unreleased/sh-add-missing-acts-as-taggable-indices.yml b/changelogs/unreleased/sh-add-missing-acts-as-taggable-indices.yml
new file mode 100644
index 00000000000..d9a1a0db9e8
--- /dev/null
+++ b/changelogs/unreleased/sh-add-missing-acts-as-taggable-indices.yml
@@ -0,0 +1,5 @@
+---
+title: Adding missing indexes on taggings table
+merge_request:
+author:
+type: performance
diff --git a/db/migrate/20180306134842_add_missing_indexes_acts_as_taggable_on_engine.rb b/db/migrate/20180306134842_add_missing_indexes_acts_as_taggable_on_engine.rb
new file mode 100644
index 00000000000..06e402adcd7
--- /dev/null
+++ b/db/migrate/20180306134842_add_missing_indexes_acts_as_taggable_on_engine.rb
@@ -0,0 +1,21 @@
+# This migration comes from acts_as_taggable_on_engine (originally 6)
+#
+# It has been modified to handle no-downtime GitLab migrations. Several
+# indexes have been removed since they are not needed for GitLab.
+class AddMissingIndexesActsAsTaggableOnEngine < ActiveRecord::Migration
+ include Gitlab::Database::MigrationHelpers
+
+ DOWNTIME = false
+
+ disable_ddl_transaction!
+
+ def up
+ add_concurrent_index :taggings, :tag_id unless index_exists? :taggings, :tag_id
+ add_concurrent_index :taggings, [:taggable_id, :taggable_type] unless index_exists? :taggings, [:taggable_id, :taggable_type]
+ end
+
+ def down
+ remove_concurrent_index :taggings, :tag_id
+ remove_concurrent_index :taggings, [:taggable_id, :taggable_type]
+ end
+end
diff --git a/db/schema.rb b/db/schema.rb
index b93e6fa594b..9fabde75625 100644
--- a/db/schema.rb
+++ b/db/schema.rb
@@ -1733,7 +1733,9 @@ ActiveRecord::Schema.define(version: 20180307012445) do
end
add_index "taggings", ["tag_id", "taggable_id", "taggable_type", "context", "tagger_id", "tagger_type"], name: "taggings_idx", unique: true, using: :btree
+ add_index "taggings", ["tag_id"], name: "index_taggings_on_tag_id", using: :btree
add_index "taggings", ["taggable_id", "taggable_type", "context"], name: "index_taggings_on_taggable_id_and_taggable_type_and_context", using: :btree
+ add_index "taggings", ["taggable_id", "taggable_type"], name: "index_taggings_on_taggable_id_and_taggable_type", using: :btree
create_table "tags", force: :cascade do |t|
t.string "name"