MYSQL объясняет ‘Использование: где; Использование временного; Использование сортировки файлов’

#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