2014-12-23 2 views
0

Я пытаюсь выполнить этот запрос в базе данных MYSQL.GROUP_CONCAT Ошибка производительности с отдельными и sub_query

SELECT FirstName,LastName 
    CONCAT(COALESCE(Address1, ''), 
    COALESCE(Address2, '')) AS Address2, 
    (SELECT GROUP_CONCAT(EmpDept ' ') FROM EMP_DEPT 
    USE INDEX (EMP_DEPT_IDX) 
    WHERE EMP_DEPT.EMP_ID = EMP.EMP_ID) AS DEPT, 
    COUNT(PIN) AS PIN, 
    MIN(SALARY) AS SALARY, 
    GROUP_CONCAT(DISTINCT PAY_CODE SEPARATOR ' ') AS PAYROLL_CODE 
FROM EMP WHERE HOUSE='YELLOW' AND HOUSE_AREA='220' 
    AND (JOIN_YEAR = '2011' OR JOIN_YEAR = '2012') 
    AND EMP_BAND='G' 
    AND (FRESHER = 'N' OR FRESHER = 'FALSE') 
    AND PIN IS NOT NULL 
    AND SALARY > 0 
GROUP BY FirstName,LastName Address3, Address2, DEPT 

Запрос работает нормально, и я получаю нужный набор результатов.

Только проблема в том, есть огромное падение производительности на этих двух строк кода, написанного с использованием GROUP_CONCAT,

(SELECT GROUP_CONCAT(EmpDept ' ') FROM EMP_DEPT 
    USE INDEX (EMP_DEPT_IDX) 
    WHERE EMP_DEPT.EMP_ID = EMP.EMP_ID) AS DEPT 


GROUP_CONCAT(DISTINCT PAY_CODE SEPARATOR ' ') AS PAYROLL_CODE 

Я попытался добавления INDEX, но до сих пор не повезло. (Только эти подзапросы не принимают вокруг 30-40sec выполнить)

Я попытался реализации присоединяется, но я новичок в MySQL нет удачи ..

Может кто-нибудь помочь мне в создании мой запрос выполняется быстрее?

ответ

0

Попробуйте заменить коррелированный подзапрос с внешним соединением с подзапросом:

SELECT FirstName,LastName 
    CONCAT(COALESCE(Address1, ''), 
    COALESCE(Address2, '')) AS Address2, 
    COALESCE(DEPT, '') AS DEPT, 
    COUNT(PIN) AS PIN, 
    MIN(SALARY) AS SALARY, 
    GROUP_CONCAT(DISTINCT PAY_CODE SEPARATOR ' ') AS PAYROLL_CODE 
FROM EMP 
LEFT JOIN (SELECT EMP_ID, GROUP_CONCAT(EmpDept SEPARATOR ' ') AS DEPT 
      FROM EMP_DEPT 
      GROUP BY EMP_ID) AS EMP_DEPT ON EMP_DEPT.EMP_ID = EMP.EMP_ID 
WHERE HOUSE='YELLOW' AND HOUSE_AREA='220' 
    AND (JOIN_YEAR = '2011' OR JOIN_YEAR = '2012') 
    AND EMP_BAND='G' 
    AND (FRESHER = 'N' OR FRESHER = 'FALSE') 
    AND PIN IS NOT NULL 
    AND SALARY > 0 
GROUP BY EMP.EMP_ID 

Кроме того, я изменил окончательный GROUP BY использовать EMP_ID колонки, а не возвращенные значения столбцов.

Также возможно, что только изменение окончательного GROUP BY решит вашу проблему. Группировка по индексированной колонке должна быть более эффективной, поэтому убедитесь, что у вас есть индекс на EMP_ID.

0

Лучший индекс для этого подзапроса - EMP_DEPT(EMPT_ID, EmpDept). Это указатель, который вы определили?

Второй group_concat() не может использовать индекс.

Если вы удалите эти две строки, насколько быстрее запрос?

Смежные вопросы