大型AWS RDS MySQL更新会丢弃连接

时间:2018-01-18 21:31:36

标签: mysql amazon-web-services amazon-rds query-performance

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

该查询适用于单行,但在应用于完整表时,它失败并显示:

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

这是在一个函数内完成的。这是实际的查询。 invoiceheader表是较小的表:

LEGACYINVOICENO是发票抬头的PK。 SELLINGDEPARTMENT也是一个索引字段,与invoiceheader中的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') 

执行计划表明嵌套循环导致invoiceheader表的全表扫描。这似乎是导致问题的原因,但我不确定如何优化内部查询。

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

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

LEGACYINVOCENO是PK并且LOTJOB_ID被索引,但是WHERE子句仍然导致全表扫描。

1 个答案:

答案 0 :(得分:0)

请勿使用IN ( SELECT ... ),更改为JOIN ... ON。这可能会避免表扫描。

向我们展示SHOW CREATE TABLE,以便我们了解您的工作内容。

适用于大型UPDATEschunk it