1
0
mirror of https://github.com/meineerde/redmine.git synced 2026-02-01 03:57:15 +00:00

Add a MySQL optimizer hint to fix a performance regression introduced in r23979 when searching issues with custom fields (#43651).

Patch by Go MAEDA (user:maeda).


git-svn-id: https://svn.redmine.org/redmine/trunk@24289 e93f8b46-1217-0410-a6f0-8f06a7374b81
This commit is contained in:
Go MAEDA 2026-01-10 01:58:32 +00:00
parent 436ff7f6e5
commit 6c932cf98c

View File

@ -109,13 +109,20 @@ module Redmine
clauses << "(#{CustomValue.table_name}.custom_field_id IN (#{fields.map(&:id).join(',')}) AND (#{visibility}))"
end
visibility = clauses.join(' OR ')
r |= fetch_ranks_and_ids(
search_scope(user, projects, options).
joins(:custom_values).
where(visibility).
where(search_tokens_condition(["#{CustomValue.table_name}.value"], tokens, options[:all_words])),
options[:limit]
)
scope =
search_scope(user, projects, options)
.joins(:custom_values)
.where(visibility)
.where(search_tokens_condition(["#{CustomValue.table_name}.value"], tokens, options[:all_words]))
if self == Issue && Redmine::Database.mysql? && ActiveRecord::Base.connection.supports_optimizer_hints?
# Force the join order to evaluate issues before custom_values.
# This avoids inefficient query plans where custom_values are scanned
# without an issue_id filter, which can be extremely slow on large datasets.
scope = scope.optimizer_hints("JOIN_ORDER(#{Issue.table_name}, #{CustomValue.table_name})")
end
r |= fetch_ranks_and_ids(scope, options[:limit])
queries += 1
end
end