2012-04-06 24 views
2

私はこれを正しく行ったと確信していますが、私のクエリは通常のラップトップのMySQLデータベースで30分現在実行されています。 「つぶやき」の表は100万レコードに過ぎません。あるテーブルから別のテーブルにテキストを挿入

何が欲しいですか?私は、テーブルBからのテキストとテーブルAの "テキスト" 欄を記入する表 "AAA"(左)と "BBB"(右)

id_str text id_str text 
------------ ------------------- 
13    13  foo bar baz 
14    14  foobar 
       13  foo bar baz 
       17  foobaz 

を考えてみましょう:

UPDATE AAA 
SET `text` = (
    SELECT `text` AS `text` 
    FROM BBB 
    WHERE id_str = AAA.id_str 
    LIMIT 1 
) 

ようにするにはテーブルAAAは次のようになります

id_str text 
------------------- 
13  foo bar baz 
14  foobar 

しかし、このクエリはあまりにも長く実行されています。私はその構文を誤っていましたか?

+0

これを行う方法の1つは、値 'AST 'を選択してテーブルBに挿入する値として' text'を使用することです。 – Grigor

+1

'AAA'は' BBB'に一致する行を含まない可能性がありますか?もしそうなら、それらの行の '' 'text''値が空であることを確認しますか? –

+0

AAAにBBBに一致がないstr_idが含まれている可能性はありません。逆に、例に示すように、BBBは同じstr_idを持つ重複したレコードセットを含むことができます。 – Pr0no

答えて

1

私が正しくあなたの状況を理解していれば、これははるかに高速でなければなりません:

UPDATE `AAA`,`BBB` SET `AAA`.`text`=`BBB`.`text` 
WHERE `AAA`.`id_str`=`BBB`.`id_str` 

あなたは一度だけこのクエリを実行する必要があります。まだ数分かかるかもしれませんが、このように(JOINを使用して)これを実行することはおそらく100万回の別のクエリを実行するよりもずっと高速になるでしょう。

AAAid_strおよびBBBid_strは、両方とも、好ましくは同じデータ型の、例えば索引付けされるべきである。両方ともint(11)でなければなりません。これによりMySQLは最大効率でそれらの間の平等関係を評価することができます。

EDIT:前述のように、システム構成やハードウェアによっては、上記のクエリに時間がかかることがあります(操作はディスクに制限されている可能性があります。また、テーブルAAAのインデックスを更新する必要があるため、AAACREATE TABLEステートメントを表示できますか?また、あなたはこの試みることができる:

CREATE TABLE `CCC` LIKE `AAA`; 
INSERT INTO `CCC` SELECT `AAA`.`str_id`,`BBB`.`text` FROM `AAA` JOIN `BBB` ON `AAA`.`id` = `BBB`.`id`; 

をこれは、しかし、古いテーブルAAAから任意のデータをコピーしません。

+0

私はあなたのヒントを考慮に入れて今このクエリを実行していますが、それでもまだ約15分かかります。同じid_strのBBBに重複したエントリがあるという問題がありますか?(投稿の例を参照してください) – Pr0no

+1

問題ではないはずです...私は自分の答えにどのように編集したのですか? – Daan

+0

私の悪い - 私はあまりにも早く話しました。私はAAA.str_idにインデックスを入れるのを忘れていました。私がした後、クエリは20秒で終わった!ありがとうございます:-) – Pr0no

1
UPDATE AAA, BBB 
SET AAA.`text` = BBB.text 
WHERE BBB.id_str = AAA.id_str 
関連する問題