0

2つのmysqlテーブルがあり、1つは別のテーブルに外部キーを持っています。mysqldumpがwhereステートメントを使用して特定のサブセットを選択的にダンプすると、2番目の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
4

1 に答える 1

0

ここにあなたが試すことができるいくつかのことがあります。

インデックスを追加してみてください:

... ON table1 (table1_id, table2_id)

DISTINCTまた、サブクエリにキーワードを追加してみてください。

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

lock-all-tablesMySQLが使用しているクエリのパフォーマンス以外に、そのオプション以外に「ハング」を引き起こす原因となるものは何もありません。それなしでテストし、同じ動作を観察したと思います。


Q:ハングの原因は何だと思いますか?

クランキングしているのはSELECTステートメントだけだと思います。table2のすべての行について、実行プランがtable1からネストされたループルックアップを実行している可能性が高いと思います。IN (subquery)述語が同等に最適化されているのではないかと思いEXISTS (correlated subquery)ます。

Q:インデックスを追加すると役立つのはなぜですか?

インデックスはまったく役に立たない場合があります。ただし、table1の適切なインデックスにより、サブクエリから結果を取得するために必要な時間が短縮される場合があります。(サブクエリの結果は「キャッシュ」される可能性が高いため、そのサブクエリが最初に実行されたときにのみ節約され、評価されるtable2の各行の節約にはなりません。)

于 2013-01-15T00:10:35.030 に答える