我正在尝试对包含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子句仍然导致全表扫描。
答案 0 :(得分:0)
请勿使用IN ( SELECT ... )
,更改为JOIN ... ON
。这可能会避免表扫描。
向我们展示SHOW CREATE TABLE
,以便我们了解您的工作内容。
适用于大型UPDATEs
,chunk it。