MySQL запрос занимает слишком много времени и не может получить данные - PullRequest
0 голосов
/ 09 апреля 2019

Я пробовал несколько способов выполнения запроса ниже, но он не извлекает вывод, как показано ниже.Я попытался проверить план выполнения, который выглядит нормально.

image

Мой код:

SELECT
SUM(case when cp.payment_method_id_fk = 3 then dt.amount_attempted else 0 end)  AS Subsequent_successDeduction_TIGO,
SUM(case when cp.payment_method_id_fk = 2 then dt.amount_attempted else 0 end)  AS Subsequent_successDeduction_MTN,
   date(dt.transaction_date) AS DateOfTransactions
FROM deduction_transactions dt INNER JOIN customer_deductions cd ON
   dt.deduction_id_fk = cd.id INNER JOIN customer_policy cp ON
   cd.cust_policy_id = cp.customer_policy_id
   inner join  policy_info pi ON cp.policy_id_fk = pi.id
inner join product_info pr on pi.product_id_fk=pr.id
where
   date(dt.transaction_date)=date_sub(curdate(),interval 1 day) and dt.status=1 and date(cp.created_date) <> date(curdate()) and cp.payment_confirmed_date <> dt.transaction_date
GROUP BY DateOfTransactions;

1 Ответ

0 голосов
/ 09 апреля 2019

Проблема в том, что ваш предикат фильтрации:

date(dt.transaction_date)=date_sub(curdate(),interval 1 day)

Страдает синдромом «выражения на левой стороне знака равенства». Это мешает оптимизатору использовать индекс. Измените это условие на:

dt.transaction_date >= date_sub(curdate(),interval 1 day) and
dt.transaction_date < curdate()

Таким образом, оптимизатор может эффективно использовать индекс, если он присутствует. Поэтому убедитесь, что у вас есть индекс для transaction_date и status, например:

create index ix1 on deduction_transactions (transaction_date, status);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...