2014-01-24 239 views
1

我在共享主機服務器中運行以下查詢時遇到問題。執行時間設置爲10秒,但我的查詢需要很長時間,我無法更改它。需要優化查詢

SELECT M.fecha_mov, -SUM(M.monto) monto, -SUM(M.interes) interes, -SUM(M.iva) iva, -SUM(M.capital) capital, 
B.banco, 
COALESCE(tg.nombre, tp.NombComp) nombreGrupo, CONCAT(nombres,' ',apellido_paterno,' ',apellido_materno) nombre, 
C.expediente, C.id_credito 
FROM movimientos M 
JOIN acreditados A ON A.id_acreditado=M.id_acreditado 
JOIN personas P ON P.id_persona=A.id_persona 
JOIN creditos C ON C.id_credito=A.id_credito 
JOIN abonos AB ON AB.id_movimiento=M.id_movimiento 
JOIN depositos_bancarios D ON D.id_deposito=AB.id_deposito 
JOIN cuentas_bancarias B ON B.id_banco=D.id_banco 
LEFT OUTER JOIN (SELECT R.id_credito, AG.nombre FROM representantes R JOIN agrupaciones AG USING (id_grupo)) tg ON tg.id_credito = C.id_credito 
LEFT OUTER JOIN (SELECT id_persona, CONCAT(nombres,' ',apellido_paterno,' ',apellido_materno) AS NombComp FROM personas) tp ON A.id_persona = tp.id_persona 
GROUP BY YEAR(M.fecha_mov), MONTH(M.fecha_mov), P.id_persona 
HAVING -SUM(M.monto) > 15000 
ORDER BY B.id_banco, M.fecha_mov, C.id_credito 

我覺得這兩個左外連接都沒有導致問題,查詢運行整齊。我正在使用左外部聯接部分,因爲只有表示表中的某個實例與信用卡表有關係,因此在沒有關係的情況下我使用與角色表的聯繫。

您認爲這個查詢可以優化嗎?

UPDATE

由於在RCL @simon和@Kickstart查詢移除一個LEFT OUTER JOIN這是沒有必要和刪除子查詢

SELECT M.fecha_mov, -SUM(M.monto) monto, -SUM(M.interes) interes, -SUM(M.iva) iva, -SUM(M.capital) capital, 
B.banco, 
COALESCE(AG.nombre, CONCAT(nombres,' ',apellido_paterno,' ',apellido_materno)) nombreGrupo, 
CONCAT(nombres,' ',apellido_paterno,' ',apellido_materno) nombre, 
C.expediente, C.id_credito 
FROM movimientos M 
JOIN acreditados A ON A.id_acreditado=M.id_acreditado 
JOIN personas P ON P.id_persona=A.id_persona 
JOIN creditos C ON C.id_credito=A.id_credito 
JOIN abonos AB ON AB.id_movimiento=M.id_movimiento 
JOIN depositos_bancarios D ON D.id_deposito=AB.id_deposito 
JOIN cuentas_bancarias B ON B.id_banco=D.id_banco 
LEFT OUTER JOIN representantes R ON R.id_credito=C.id_credito 
LEFT OUTER JOIN agrupaciones AG ON AG.id_grupo=R.id_grupo 
GROUP BY YEAR(M.fecha_mov), MONTH(M.fecha_mov), P.id_persona 
HAVING -SUM(M.monto) > 15000 
ORDER BY B.id_banco, M.fecha_mov, C.id_credito 

UPDATE

有所改善

謝謝大家的寶貴提示,現在我可以在1秒內運行我的查詢!我會按照建議發佈我的查詢計劃,如果您有任何建議,請讓我知道。說實話,我是新的查詢計劃的事情。

 
'1', 'SIMPLE', 'C', 'ALL', 'PRIMARY', NULL, NULL, NULL, '888', 'Using temporary; Using filesort' 
'1', 'SIMPLE', 'R', 'ref', 'fk_representantes_creditos_idx', 'fk_representantes_creditos_idx', '4', 'creabien_sacredi_dev.C.id_credito', '1', '' 
'1', 'SIMPLE', 'AG', 'eq_ref', 'PRIMARY', 'PRIMARY', '4', 'creabien_sacredi_dev.R.id_grupo', '1', '' 
'1', 'SIMPLE', 'A', 'ref', 'PRIMARY,FK_acreditados_personas,FK_acreditados_creditos', 'FK_acreditados_creditos', '4', 'creabien_sacredi_dev.C.id_credito', '2', '' 
'1', 'SIMPLE', 'P', 'eq_ref', 'PRIMARY', 'PRIMARY', '4', 'creabien_sacredi_dev.A.id_persona', '1', '' 
'1', 'SIMPLE', 'M', 'ref', 'PRIMARY,FK_movimientos_acreditados', 'FK_movimientos_acreditados', '4', 'creabien_sacredi_dev.A.id_acreditado', '10', '' 
'1', 'SIMPLE', 'AB', 'ref', 'FK_abonos_depositos_bancarios,FK_abonos_movimientos', 'FK_abonos_movimientos', '8', 'creabien_sacredi_dev.M.id_movimiento', '1', '' 
'1', 'SIMPLE', 'D', 'eq_ref', 'PRIMARY,FK_depositos_bancarios_cuentas_bancarias', 'PRIMARY', '8', 'creabien_sacredi_dev.AB.id_deposito', '1', '' 
'1', 'SIMPLE', 'B', 'ALL', 'PRIMARY', NULL, NULL, NULL, '6', 'Using where; Using join buffer' 
+0

你檢查,你不會錯過任何索引? – Bobby

+0

@Bobby爲什麼你的意思是缺少索引?我正在使用innoDB引擎 –

+0

爲什麼這些子查詢*子查詢*?爲什麼他們不像其他所有的經常加入? – Strawberry

回答

0

感謝所有的意見,得到的回答是:

SELECT M.fecha_mov, -SUM(M.monto) monto, -SUM(M.interes) interes, -SUM(M.iva) iva, -SUM(M.capital) capital, 
B.banco, 
COALESCE(AG.nombre, CONCAT(nombres,' ',apellido_paterno,' ',apellido_materno)) nombreGrupo, 
CONCAT(nombres,' ',apellido_paterno,' ',apellido_materno) nombre, 
C.expediente, C.id_credito 
FROM movimientos M 
JOIN acreditados A ON A.id_acreditado=M.id_acreditado 
JOIN personas P ON P.id_persona=A.id_persona 
JOIN creditos C ON C.id_credito=A.id_credito 
JOIN abonos AB ON AB.id_movimiento=M.id_movimiento 
JOIN depositos_bancarios D ON D.id_deposito=AB.id_deposito 
JOIN cuentas_bancarias B ON B.id_banco=D.id_banco 
LEFT OUTER JOIN representantes R ON R.id_credito=C.id_credito 
LEFT OUTER JOIN agrupaciones AG ON AG.id_grupo=R.id_grupo 
GROUP BY YEAR(M.fecha_mov), MONTH(M.fecha_mov), P.id_persona 
HAVING -SUM(M.monto) > 15000 
ORDER BY B.id_banco, M.fecha_mov, C.id_credito