2011-01-24 15 views
0

'source_key'フィールドのインデックスを使用して次のSQLクエリを実行しようとしています。 MySQLでは、それは非常に長い時間のために '送信データ'のステータスでハングします。MySQLで非常に遅い内部結合クエリを高速化

UPDATE clients_test c 
INNER JOIN 
(
select dob, last_name, soundex(first_name) as soundexfirstname, max(source_key) as keep 
from clients_test 
group by dob, last_name, soundex(first_name) 
having count(*) = 2 
) k 
ON c.dob=k.dob AND c.last_name=k.last_name AND soundex(c.first_name)=k.soundexfirstname 
SET duplicate_key = NULLIF(k.keep, c.source_key), 
duplicate = (k.keep = c.source_key); 

データベーステーブルclients_testの重複レコードを識別して削除することになっています。この作業をより速くするか、クエリをより効率的に変更する方法はありますか?

答えて

2

私の最初の考えは、すべての行に対してsoundex()値を再計算するのではなく、データベースに格納することです。

新しいsoundex()列にCHECK()制約を追加して、 'first_name'列との同期がとれるようにします。

また、クエリを調整しようとするときは、EXPLAINはあなたの友人です。

+0

事前に計算されたフィールドにsoundexを移動すると、このクエリが確実にスピードアップされます。低電力のクラウドインスタンスではまだ長い時間がかかりましたが、少なくとも1日以上はハングしませんでした。 – Darren

関連する問題