繁体   English   中英

MySQL加入子查询优化

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM