Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 需要优化查询_Mysql_Sql_Join - Fatal编程技术网

Mysql 需要优化查询

Mysql 需要优化查询,mysql,sql,join,Mysql,Sql,Join,在共享主机服务器中运行以下查询时遇到问题。执行时间设置为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,'

在共享主机服务器中运行以下查询时遇到问题。执行时间设置为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
我认为两个左-外连接都会导致问题,如果没有它们,查询将运行得很整洁。我使用左侧外部联接部分,因为只有representantes表的一些实例与creditos表有关系,所以在没有关系的情况下,我使用join with personas表

你认为这个查询可以优化吗

更新

多亏了@simon at rcl和@Kickstart,查询得到了改进,删除了一个不需要的左外部连接,并删除了子查询

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
更新

谢谢你们的宝贵提示,现在我可以在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'
感谢所有评论,答案如下:

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

发布表架构并确保使用索引。您可以去掉角色的第二个左外部连接:您已经在查询该表,并且可以用CONCATa.nombres、、a.apellido_paterno、、a.apellido_materno替换coalesce中的tp.NombComp。至少,您需要在连接的on部分中提到的列上,在您要连接到的表中使用索引:例如,在acreditatos.id_acreditado上,等等。看起来不像这样,因为这样会查询一个不在SELECT中的表。为了进一步改进,您需要查看查询计划。您可以将其他子查询更改为一对左外部联接,例如-R.id\u credito=C.id\u credito上的左外部联接表示符R.id\u credito tg.id\u grupo=R.id\u grupo上的左外部联接agrupacions tg。但是,这取决于关系,即,如果R.id_credito不是唯一的和/或tg.id_grupo不是唯一的感谢您的帮助@Rachcha,我已经发布了解释语句,并按照Kickstart的建议删除了子查询