2017-07-18 17 views
0

は、私はこの例外MySQLの長いクエリロック・タイムアウト例外

 Lock wait timeout exceeded; try restarting transaction 

を取得していますし、私はこのクエリを実行している、私を助けることができるしてください。

UPDATE Table1 INNER JOIN Table2 
    SET Table1.xCoord = Table2.Longitude, Table1.yCoord = Table2.Latitude, 
    Table1.location2 = CONCAT(Table2.Street, ', ', Table2.Post_Town, ', ', 
    Table2.County, ', ', Table2.Postcode, ', UK ') 
    WHERE (Table1.location2 = '' OR Table1.location2 IS NULL) AND 
    (Table1.location1 LIKE CONCAT('%', Table2.Street, '%')) 
    AND (Table2.location1 LIKE CONCAT('%', Table2.Post_Town, '%')); 

表2は3000万行、表1は4000行です(増加する可能性があります)。私は1.ストリート2.町の指数を持っています。 Rick Iveさんに返信して、サンプルテーブルを与えました。

  • 表1

|場所1 ||場所2 ||郵便番号

||フラット30 234ハードドライブストリートmorganvale ||(新しい文字列の追加)||

  • 表2

||家なし||通り||町||郵便番号|| xcoord || ycoord ||

|| 234 ||ハードドライブストリート||モルガンベール|| mr12 123 || 5.1234 || 24.2345 ||

とLIKEパターンを使用して通りの名前と町に一致しています。カンマは削除され、location1はすべて小文字です。

私はAWSを使用しており、書き込み速度を向上させるために100GBの記憶容量があり、2GBのRAMを搭載したt2.smallを使用しています。

私の質問は、このクエリをより速く実行できるようにする方法と、ロック待機のタイムアウト例外を防止する方法です。クエリは正しいですか?


クエリの目的は、テーブル2の3000万のファイルからx座標とy座標と位置をtable1に追加することです。

私はいくつかの選択肢を考えていましたか? postgis postgisはこのクエリをmysqlより速く実行します。 Javaのようなアプリケーションからのこのテーブルの結合にはどうしたらいいですか?

+0

このクエリでは、インデックスを使用してwhere条件を高速化することはできません。代わりに全文索引と全文検索を使用することを検討してください。 – Shadow

+1

あなたのクエリは2つのテーブルの間にデカルト結合を作成し、4000万3000万のレコードを作成し、インデックスを使用する可能性はありません。あなたはこの運動を完全に再考する必要があります。 – Shadow

+0

そして、我々はそれが何をするかわからないし、あなたのデータを知っていないので、質問がコアクトであるかどうかについてコメントする方法はありません。 – Shadow

答えて

2
  • クエリは非常に悪質なものです。つまり、table1のすべての行とtable2のすべての行をペアにする必要があります。テストするものは120 です。今月の第6日曜日までに走るのではなく、中断してうれしいです。
  • ORは、パフォーマンスストロークまたはNULLのいずれかを選択することをお勧めします。
  • LIKE '%xx%'インデックスを使用しません。
  • LIKEの代わりにFULLTEXTを使用することを検討してください。
  • 2GBのRAMは、innodb_buffer_pool_sizeが小さすぎてテーブル全体をキャッシュすることができないこと、またはスワッピングするほどに高く設定されていることを意味します。 (MySQLの場合、スワッピングはひどいです。)その設定の値を探します。
  • UPDATEは、SELECTsよりも深刻なロックを必要とします。 SELECT id FROM tbl WHERE ...を実行して問題の行のIDを取得し、それにかかる時間を確認してください。次に、可能な選択肢について議論することができます。
  • テーブルごとにSHOW CREATE TABLEを入力してください。

ボトムライン:アルゴリズムを再考してください。

+0

こんにちはリック、postgisの拡張機能を持つpostgresqlはそのような呼び出しを実現しますか? – KDJ

+1

@KDJ Mysqlには、デフォルトで地理空間データ型と関数があります。しかし、あなたは地理空間操作をしておらず、パターンマッチングを行っています。したがって、いいえ、postgresqlに切り替えても何も解決されません。 – Shadow

+0

とpostgresqlを使用すると、テーブルはヒープに順番に格納されるため、速度に影響する可能性があります。 – KDJ

関連する問題