[英]MySQL joined subqueries optimization
我在MySQL中有以下查询
select * from
(
select asiento, fecha, sum(debe) as debe, sum(haber) as haber
from apuntes
where apuntes.sobreescrito is null
group by asiento, fecha
order by fecha, asiento
)asientos
left join
(
select id_diario, asiento, fecha, sum(debe) as debe, sum(haber) as haber
from apuntes
where apuntes.sobreescrito is not null
group by asiento, fecha, id_diario
order by fecha, asiento
)asientos_antiguos
on asientos.asiento = asientos_antiguos.asiento and asientos.fecha = asientos_antiguos.fecha
where
asientos_antiguos.debe <> asientos.debe
or
asientos_antiguos.haber <> asientos.haber
第一个子查询(asientos)返回大约2万条记录,而在正常情况下,第二个查询不应返回那20k条记录,这将产生3-4秒的可接受查询,但从理论上讲,它可以在每条记录上重复记录操作,因此我测试了产生的10万条记录,大约需要30秒(不可接受)。
在这一点上,我试图为字段“ asiento”和“ fecha”创建索引,但是子查询没有从中受益。 另外,我为每个子查询创建了两个视图,希望可以在这些子视图中创建索引,但是视图限制包括“无索引”。
任何帮助,将不胜感激。
编辑1
好的,我将尽力解释我要达到的目标,并随时纠正我的英语,我将使用我可能不知道的财务词汇。
我已经开发了一个Web应用程序,该应用程序可以读取带有书籍条目的excel文件(每个文件通常包含20k条记录),并将这些书籍条目保存到表中(以我的情况为准)。
有时,在字段“ fecha”和“ asiento”相同且字段“ id_diario”不同的情况下,其中某些条目可能会被覆盖(注意:每张excel图书都会生成一组具有其自己的“ id_diario”的图书条目”,因此我可以区分较早的记录)
至此,一切正常,但现在我必须生成一个报告,以指示在某些时候被覆盖的图书条目(财务用语,不知道它是否正确)是否与新覆盖的图书数量不同。他们。
这是我进行此查询时的情况,其中第一个子查询获取未覆盖的所有记录(apuntes.sobreescrito为NULL),第二个子查询获取与第一个子查询匹配的所有覆盖的记录。
在我的测试用例中,第二个子查询为每个有效的书本条目生成3个覆盖记录(有3个覆盖操作),这意味着比较60k与20k记录。
下一步,我将使用“ GROUP_CONCAT”操作生成带有第二查询结果的json格式的数组,但是第一,我必须解决性能问题。
想知道是否可以使用更基本的查询来确定不匹配的记录,然后仅获取这些记录的真实详细信息。 如果您感兴趣的已更改记录数只是所有记录中的一小部分,这可能会有所帮助。
例如,类似这样的内容应查找已更改的记录-
SELECT asiento, fecha
FROM
(
SELECT id_diario, asiento, fecha, SUM(debe) AS debe, SUM(haber) AS haber
FROM apuntes
GROUP BY id_diario, asiento, fecha
) sub0
GROUP BY asiento, fecha
HAVING MIN(debe) != MAX(debe)
OR MIN(haber) != MAX(haber)
您可能会用它来缩小需要检查的实际记录的范围。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.