#mysql
#mysql
Вопрос:
Я пытаюсь оптимизировать хранимую процедуру. Я выявил некоторые проблемы с этим, но я не знаю достаточно, чтобы действительно исправить проблемы. Один из подзапросов выглядит следующим образом
select d.districtCode,
b.year Year,
if(bli.releaseAdjustment = 3 and bli.id not in (select billLineItem_id from AppliedDiscount),
bli.amount ,0) *-1 Refund
from Bill b
join BillLineItem bli on bli.bill_id = b.id
left join Bill_District d on d.bill_id = b.id
and bli.type = d.type
left join AppliedDiscount a on a.billLineItem_id = bli.id
where bli.releaseAdjustment in (1,2,3)
and bli.type in (4,6)
group by d.districtCode, b.year
EXPLAIN
Выводит следующее
---- ------------------------ --------------- -------------- -------------------------------- ----------------- --------- --------------------- --------- ----------------------------------------------
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
---- ------------------------ --------------- -------------- -------------------------------- ----------------- --------- --------------------- --------- ----------------------------------------------
| 1 | PRIMARY | bli | ALL | FKF4236A,type,releaseAdjustment| NULL | NULL | NULL | 2787322 | Using where; Using temporary; Using filesort |
| 1 | PRIMARY | b | eq_ref | PRIMARY | PRIMARY | 8 | tax.bli.bill_id | 1 | |
| 1 | PRIMARY | d | ref | bill_id,type | bill_id | 8 | tax.bli.bill_id | 1 | |
| 1 | PRIMARY | a | ref | billLineItem_idx | billLineItem_idx| 8 | tax.bli.id | 1 | Using index |
| 1 | DEPENDENT SUBQUERY |AppliedDiscount|index_subquery| billLineItem_idx | billLineItem_idx| 8 | func | 1 | Using index |
---- ------------------------ --------------- -------------- -------------------------------- ----------------- --------- --------------------- --------- ----------------------------------------------
Как бы вы посоветовали мне это исправить? Эта проблема или одна очень похожая встречается в этой хранимой процедуре множество раз. AppliedDiscount
состоит только из 3 столбцов, все из которых уже проиндексированы.
Редактировать: удаление group by
изменений в первой строке объяснения
| 1 | PRIMARY | bli | ALL | FKF4236A,type,releaseAdjustment,bill_id| NULL | NULL | NULL | 2613847 | Using where |
Это лучше и технически отвечает на мой вопрос, но это просто означает, что я задал неправильный вопрос.
«Тип» — это все еще ВСЕ. Что я могу сделать, чтобы улучшить это?
Комментарии:
1. Какова цель группы без какой-либо агрегации?
2. Извините, я не уверен, что понимаю ваш вопрос. Этот запрос является подзапросом и относится
union all
к другим подзапросам.3. Я не говорю, что это плохой вопрос, просто я недостаточно знаю, чтобы понять, о чем вы спрашиваете.
4. @P.Salmon Удаление
group by
изменений в первой строке объяснения. Это лучше и технически отвечает на мой вопрос, но это просто означает, что я задал неправильный вопрос. «Тип» — это все еще ВСЕ. Что я могу сделать, чтобы улучшить это?5. запросы, которые
IN
часто используются, снижают производительность, попробуйте устранить их с помощью левых соединений или временных таблиц. вы используетеIN
три раза, oof