Подскажите как ускорить выборку

spudei

Здравствуйте,Подскажите, как можно ускорить выполнение запроса:
SELECT acts.dept_id, SUM(if(kind IN ("l", "fl"), cnt, 0)) as v_count, SUM(if(kind IN ("v", "dv"), cnt, 0)) as h_count, depts.name, depts.begin, depts.distr, locs.usage
FROM `acts` JOIN depts ON (depts.id = acts.dept_id) JOIN locs ON (locs.id = depts.loc_id)
WHERE (depts.begin >= '2012-01-01' AND acts.dept_id IN (SELECT checks.dept_id FROM checks WHERE checks.agent_id = 100)) AND
 (((acts.insp_date <= '2012-03-31') AND (acts.insp_date >= '2012-03-01')) AND (`acts`.`reg_type` = 'Cb' AND `acts`.`reg_id` = 5))
GROUP BY acts.dept_id
HAVING v_count > 0 OR h_count > 0 ORDER BY depts.begin
План:
| 1 | PRIMARY | acts | ref | index_acts_on_insp_date,index_acts_on_dept_id,index_acts_on_reg_type_and_reg_id,index_acts_on_insp_date_and_hash | index_acts_on_reg_type_and_reg_id | 263 | const,const | 5105114 | Using where; Using temporary; Using filesort |
| 1 | PRIMARY | depts | eq_ref | PRIMARY,index_depts_on_loc_id_and_begin,index_depts_on_begin_and_pl | PRIMARY | 4 | tesu.acts.dept_id | 1 | Using where |
| 1 | PRIMARY | locs | eq_ref | PRIMARY | PRIMARY | 4 | tesu.depts.loc_id | 1 | |
| 2 | DEPENDENT SUBQUERY | checks | index_subquery | fk_checks_agent,checks_checkable_id_index | checks_checkable_id_index | 5 | func | 40 | Using where |
3 ответа

spudei

Первое, что бросается в глаза - избавьтесь от IN (SELECT ... ), например, заменой на JOIN.


spudei

Отбирается 5 миллионов записей, и по ним групповуха - куда тут ускорять?


spudei

ND acts.dept_id IN
вот это оптимизурется как depend subquery и выполняется 5105114 раз.