diff --git a/app/models/solid_queue/blocked_execution.rb b/app/models/solid_queue/blocked_execution.rb index 4ad4d239..68551a5f 100644 --- a/app/models/solid_queue/blocked_execution.rb +++ b/app/models/solid_queue/blocked_execution.rb @@ -26,7 +26,9 @@ def release_many(concurrency_keys) def release_one(concurrency_key) transaction do - if execution = ordered.where(concurrency_key: concurrency_key).limit(1).non_blocking_lock.first + if execution = ordered.where(concurrency_key: concurrency_key).limit(1) + .use_index(:index_solid_queue_blocked_executions_for_release) + .non_blocking_lock.first execution.release end end diff --git a/app/models/solid_queue/record.rb b/app/models/solid_queue/record.rb index 0a704d2c..8c7000bf 100644 --- a/app/models/solid_queue/record.rb +++ b/app/models/solid_queue/record.rb @@ -20,6 +20,13 @@ def supports_insert_conflict_target? connection.supports_insert_conflict_target? end end + + # Pass index hints to the query optimizer using SQL comment hints. + # Uses MySQL 8 optimizer hint query comments, which SQLite and + # PostgreSQL ignore. + def use_index(*indexes) + optimizer_hints "INDEX(#{quoted_table_name} #{indexes.join(', ')})" + end end end end