Re-organise "issues" indexes for faster ordering

By adding various composite indexes we can reduce the time spent
retrieving issue lists. Because of the way these indexes are built
column wise we can also remove some standalone indexes, keeping the
total number of indexes in check.
This commit is contained in:
Yorick Peterse 2017-08-03 15:18:57 +02:00
parent 27d34789c9
commit 9b3f0569fa
No known key found for this signature in database
GPG Key ID: EDD30D2BEB691AC9
3 changed files with 51 additions and 3 deletions

View File

@ -0,0 +1,4 @@
---
title: Re-organise "issues" indexes for faster ordering
merge_request:
author:

View File

@ -0,0 +1,43 @@
# See http://doc.gitlab.com/ce/development/migration_style_guide.html
# for more information on how to write migrations for GitLab.
class ReorganiseIssuesIndexesForFasterSorting < ActiveRecord::Migration
include Gitlab::Database::MigrationHelpers
# Set this constant to true if this migration requires downtime.
DOWNTIME = false
disable_ddl_transaction!
REMOVE_INDEX_COLUMNS = %i[project_id created_at due_date updated_at].freeze
ADD_INDEX_COLUMNS = [
%i[project_id created_at id state],
%i[project_id due_date id state],
%i[project_id updated_at id state]
].freeze
TABLE = :issues
def up
add_indexes(ADD_INDEX_COLUMNS)
remove_indexes(REMOVE_INDEX_COLUMNS)
end
def down
add_indexes(REMOVE_INDEX_COLUMNS)
remove_indexes(ADD_INDEX_COLUMNS)
end
def add_indexes(columns)
columns.each do |column|
add_concurrent_index(TABLE, column) unless index_exists?(TABLE, column)
end
end
def remove_indexes(columns)
columns.each do |column|
remove_concurrent_index(TABLE, column) if index_exists?(TABLE, column)
end
end
end

View File

@ -11,7 +11,7 @@
#
# It's strongly recommended that you check this file into your version control system.
ActiveRecord::Schema.define(version: 20170728101014) do
ActiveRecord::Schema.define(version: 20170803130232) do
# These are extensions that must be enabled in order to support this database
enable_extension "plpgsql"
@ -641,12 +641,13 @@ ActiveRecord::Schema.define(version: 20170728101014) do
add_index "issues", ["assignee_id"], name: "index_issues_on_assignee_id", using: :btree
add_index "issues", ["author_id"], name: "index_issues_on_author_id", using: :btree
add_index "issues", ["confidential"], name: "index_issues_on_confidential", using: :btree
add_index "issues", ["created_at"], name: "index_issues_on_created_at", using: :btree
add_index "issues", ["deleted_at"], name: "index_issues_on_deleted_at", using: :btree
add_index "issues", ["description"], name: "index_issues_on_description_trigram", using: :gin, opclasses: {"description"=>"gin_trgm_ops"}
add_index "issues", ["due_date"], name: "index_issues_on_due_date", using: :btree
add_index "issues", ["milestone_id"], name: "index_issues_on_milestone_id", using: :btree
add_index "issues", ["project_id", "created_at", "id", "state"], name: "index_issues_on_project_id_and_created_at_and_id_and_state", using: :btree
add_index "issues", ["project_id", "due_date", "id", "state"], name: "index_issues_on_project_id_and_due_date_and_id_and_state", using: :btree
add_index "issues", ["project_id", "iid"], name: "index_issues_on_project_id_and_iid", unique: true, using: :btree
add_index "issues", ["project_id", "updated_at", "id", "state"], name: "index_issues_on_project_id_and_updated_at_and_id_and_state", using: :btree
add_index "issues", ["relative_position"], name: "index_issues_on_relative_position", using: :btree
add_index "issues", ["state"], name: "index_issues_on_state", using: :btree
add_index "issues", ["title"], name: "index_issues_on_title_trigram", using: :gin, opclasses: {"title"=>"gin_trgm_ops"}