mysqldump挂起

时间:2013-01-15 00:00:41

标签: mysqldump

我有2个mysql表,其中一个在另一个表中有一个外键。当mysqldump使用where语句有选择地转储某些子集时,第二个mysqldump进入准备状态并永久挂起。我该如何解决这个问题?

mysqldump -u$username -p$password --quick --lock-all-tables --where="table1_id<1000" $db table1 > $dump_dir/table1.sql                                                                                                 

mysqldump -u$username -p$password --quick --lock-all-tables --where="table2_id in (select table2_id from table1 where table1_id<1000)" $db table2 >$dump_dir/table2.sql

1 个答案:

答案 0 :(得分:0)

以下是您可以尝试的几件事。

尝试添加索引:

... ON table1 (table1_id, table2_id)

另外,尝试在子查询中添加DISTINCT关键字:

 table2_id in (select DISTINCT table2_id from table1 where table1_id<1000)

除了执行MySQL正在使用的查询之外,我没有看到任何应该导致“挂起”的内容,除了lock-all-tables选项。我假设你没有测试,并观察到相同的行为。


问:您怀疑导致挂起的是什么?

我怀疑它只是正在启动的SELECT语句。我认为对于table2中的每一行,执行计划都可能从table1执行嵌套循环查找。我怀疑IN (subquery)谓词正在优化为等效的EXISTS (correlated subquery)

问:为什么添加索引有帮助?

索引可能根本没用。但是table1上的适当索引可能会减少从子查询中检索结果所需的时间。 (很可能子查询的结果将被“缓存”,因此在首次运行子查询时只会节省成本,而不是从已评估的table2中每行节省。)

相关问题