大型 AWS RDS MySQL 更新断开连接

Large AWS RDS MySQL update drops connection

我正在尝试对包含 279,480 行的 table 执行批量更新。更新必须查询另一个table 1,113,770。更新将 select 一组记录,然后计算它们的总和并将结果应用于正在更新的 table 中的列。

该查询对单行非常有效,但是当应用于完整 table 时,它会失败:

Error Code: 2013. Lost connection to MySQL server during query

这是在函数内部完成的。这是实际的查询。发票抬头 table 较小 table:

LEGACYINVOICENO 是发票抬头的 PK。 SELLINGDEPARTMENT 也是一个索引字段,就像发票抬头中的 POSTDATE 一样。

SELECT SUM(EXTENDEDPRICE)+SUM(TAX) FROM invoicedetail 
    WHERE LEGACYINVOICENO IN(
    SELECT LEGACYINVOICENO FROM invoiceheader 
    WHERE SELLINGDEPARTMENT = _department
    AND POSTDATE < _postdate
       AND LOTJOB_ID = _ljID) into _balance_used;

更新信息。 这是使用单个实例实际工作的查询示例:

 SELECT SUM(EXTENDEDPRICE)+SUM(TAX) FROM invoicedetail 
    WHERE LEGACYINVOICENO IN(
    SELECT LEGACYINVOICENO FROM invoiceheader 
    WHERE SELLINGDEPARTMENT = 2
    AND POSTDATE < '2013-06-06'
       AND LOTJOB_ID = '45497100FOXLAND1640') 

执行计划表明嵌套循环导致发票抬头 table 的完整 table 扫描。这似乎是问题的可能原因,但我不确定我需要如何优化内部查询。

出于测试目的,我简化了查询:

 SELECT SUM(EXTENDEDPRICE)+SUM(TAX) FROM invoicedetail 
    WHERE LEGACYINVOICENO IN(
    SELECT LEGACYINVOICENO FROM invoiceheader 
    WHERE LOTJOB_ID = '45497100FOXLAND1640') 

LEGACYINVOCENO 是 PK,LOTJOB_ID 已编入索引,但 WHERE 子句仍会导致完整的 table 扫描。

不要使用 IN ( SELECT ... ),改为 JOIN ... ON。这可能会避免 table 扫描。

向我们展示 SHOW CREATE TABLE 以便我们知道您在使用什么。

UPDATEs,chunk it.