diff --git a/src/RequestInsurance/Commands/FailOrReadyProcessingRequestInsurances.php b/src/RequestInsurance/Commands/FailOrReadyProcessingRequestInsurances.php index e662103..9564d67 100644 --- a/src/RequestInsurance/Commands/FailOrReadyProcessingRequestInsurances.php +++ b/src/RequestInsurance/Commands/FailOrReadyProcessingRequestInsurances.php @@ -44,7 +44,9 @@ public function handle(): int */ protected function unstuckProcessingRequestInsurances(): void { - RequestInsurance::query()->where('state', State::PROCESSING) + RequestInsurance::query() + ->forceIndex('request_insurances_state_priority_index') + ->where('state', State::PROCESSING) ->where('state_changed_at', '<', Carbon::now('UTC')->subMinutes(10)) ->cursor() ->each(function (RequestInsurance $requestInsurance) { diff --git a/src/RequestInsurance/Commands/UnlockBlockedRequestInsurances.php b/src/RequestInsurance/Commands/UnlockBlockedRequestInsurances.php index d609f37..42cdd38 100644 --- a/src/RequestInsurance/Commands/UnlockBlockedRequestInsurances.php +++ b/src/RequestInsurance/Commands/UnlockBlockedRequestInsurances.php @@ -31,6 +31,7 @@ class UnlockBlockedRequestInsurances extends Command public function handle(): int { RequestInsurance::query() + ->forceIndex('request_insurances_state_priority_index') ->where('state', State::PENDING) ->where('state_changed_at', '<', Carbon::now('UTC')->subMinutes(5)) ->update(['state' => State::READY, 'state_changed_at' => Carbon::now('UTC')]); diff --git a/src/RequestInsurance/Models/RequestInsurance.php b/src/RequestInsurance/Models/RequestInsurance.php index 337dfb6..d18b9a1 100644 --- a/src/RequestInsurance/Models/RequestInsurance.php +++ b/src/RequestInsurance/Models/RequestInsurance.php @@ -12,6 +12,7 @@ use GuzzleHttp\TransferStats; use Cego\RequestInsurance\Events; use Illuminate\Support\Enumerable; +use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\Log; use Illuminate\Support\Facades\Date; use Illuminate\Support\Facades\Crypt; @@ -580,6 +581,15 @@ protected function usesEncryption(): bool return $this->encrypted_fields != null; } + public function scopeForceIndex(Builder $query, string $indexName) + { + if ($this->getConnection()->getDriverName() !== 'mysql') { + return $query; + } + + return $query->from(DB::raw(sprintf('`%s` FORCE INDEX (`%s`)', $this->getTable(), $indexName))); + } + /** * Query scope for getting all RequestInsurances that are ready to be processed * diff --git a/src/RequestInsurance/RequestInsuranceWorker.php b/src/RequestInsurance/RequestInsuranceWorker.php index 863d350..042146e 100644 --- a/src/RequestInsurance/RequestInsuranceWorker.php +++ b/src/RequestInsurance/RequestInsuranceWorker.php @@ -247,6 +247,7 @@ protected function atMostOnceEverySecond(Closure $closure): void protected function readyWaitingRequestInsurances(): void { RequestInsurance::query() + ->forceIndex('covering_index') ->where('state', State::WAITING) ->where('retry_at', '<=', Carbon::now('UTC')) ->update(['state' => State::READY, 'state_changed_at' => Carbon::now('UTC'), 'retry_at' => null]); @@ -425,6 +426,7 @@ public function acquireLockOnRowsToProcess(): Collection public function getIdsOfReadyRequests() { $builder = resolve(RequestInsurance::class)::query() + ->forceIndex('request_insurances_state_priority_index') ->select('id') ->readyToBeProcessed() ->take(Config::get('request-insurance.batchSize'));