Оптимизация запроса для MySql База данных - PullRequest
0 голосов
/ 17 марта 2020

Мне нужно оптимизировать этот запрос, чтобы он выполнялся с минимальным временем и извлекал запись.

SELECT DISTINCT cp.sno,cp.case_sno,c.case_no,c.cus_case_no,c.institued_date,
       c.ins_sno,cp.case_stage,c.emp_sno,c.objections,cp.wb_sno,cp.is_decided
FROM cases c,cases_proceedings cp 
WHERE c.sno = cp.case_sno 
      AND cp.is_decided = 1 AND cp.is_current = 1 
      AND c.sno IN(SELECT DISTINCT r.case_sno FROM recordroom r 
                   WHERE c.sno = r.case_sno GROUP BY r.case_sno 
                   ORDER BY r.case_sno) 
GROUP BY cp.case_sno
ORDER BY cp.case_sno ASC

Сценарий запроса таков:

   Cases Table is the master table having PK on sno
   cases_proceedings is the child table which repeats Cases' table sno as case_sno
   Recordroom table is also the child table which keeping cases' table sno as case_sno

Проблема: приведенный выше запрос занимает 17.x секунд на выполнение, что явно больше обычного времени ...

Кто-нибудь знает, как оптимизировать это, чтобы получить плодотворный результат с минимальным временем?

1 Ответ

1 голос
/ 17 марта 2020

На первой итерации внутренний запрос можно оптимизировать, удалив сортировку и группировку:

SELECT DISTINCT cp.sno,cp.case_sno,c.case_no,c.cus_case_no,c.institued_date,
       c.ins_sno,cp.case_stage,c.emp_sno,c.objections,cp.wb_sno,cp.is_decided
FROM cases c,cases_proceedings cp 
WHERE c.sno = cp.case_sno 
      AND cp.is_decided = 1 AND cp.is_current = 1 
      AND c.sno IN (SELECT DISTINCT r.case_sno FROM recordroom) 
GROUP BY cp.case_sno
ORDER BY cp.case_sno ASC;

На второй итерации мы можем переписать запрос с помощью объединений:

SELECT DISTINCT 
    cp.sno,cp.case_sno,c.case_no,c.cus_case_no,c.institued_date,
    c.ins_sno,cp.case_stage,c.emp_sno,c.objections,cp.wb_sno,cp.is_decided
FROM cases c
JOIN cases_proceedings cp ON c.sno = cp.case_sno 
JOIN recordroom r ON c.sno = r.case_sno
WHERE cp.is_decided = 1 AND cp.is_current = 1 
-- GROUP BY cp.case_sno /*redundant with DISTINCT*/
ORDER BY cp.case_sno ASC;
...