【问题标题】:mysqldump hangsmysqldump 挂起
【发布时间】:2012-12-29 00:53:04
【问题描述】:

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

mysqldump -u$username -p$password --quick --lock-all-tables --where="table1_id $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$dump_dir/table2.sql

【问题讨论】:

    标签: mysqldump


    【解决方案1】:

    您可以尝试以下几件事。

    尝试添加索引:

    ... 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 评估的每一行节省。)

    【讨论】:

    • 我试过了,但没有帮助。为什么添加索引会有所帮助?您怀疑是什么导致了挂起?
    • IN(子查询)导致挂起,因为 mysql 一遍又一遍地重新执行子查询..
    猜你喜欢
    • 2015-04-08
    • 2011-12-14
    • 1970-01-01
    • 1970-01-01
    • 2011-04-23
    • 2018-11-14
    • 2015-10-20
    • 2013-11-12
    • 2017-07-09
    相关资源
    最近更新 更多