大型 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.
我正在尝试对包含 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.