2

簡単にするために、2つのテーブルがあります。以下を例として考えてください。

  • 連絡先 (名前と電子メールがある)
  • メッセージ (メッセージだけでなく、連絡先テーブルに同期する必要がある名前と電子メールもあります)

さて、「リレーショナルメソッドを使え」とか外部キーとか言いたくてうずうずしている方のためにお願いします。メッセージテーブル自体にメッセージの名前と電子メールの「コピー」が必要であり、時々同期する必要があります。

同期要件に従って、メッセージの名前を連絡先テーブルの最新の名前と同期する必要があります。

私は基本的に、連絡先テーブルのすべての行のループに次の UPDATE SQL を持っています

UPDATE messages SET name=(
SELECT name FROM contacts WHERE email = '$cur_email')
WHERE email='$cur_email'

上記はすべての連絡先をループし、私が持っている数の連絡先を起動します。

内部を使用せずにこれを行うためのループのアイデアがいくつかありますSELECTが、上記の方が効率的であると思いましたが(そうですか?)、より効率的なSQLの方法があるかどうか疑問に思っていましたか? お気に入り:

UPDATE messages SET name=(
SELECT name FROM contacts WHERE email = '$cur_email')
WHERE messages.email=contacts.email 

結合のように見える何か?

4

2 に答える 2

0

もっと効率化すればいいと思う

UPDATE messages m  JOIN contacts n  on  m.email=n.email SET m.name=n.name
于 2013-04-25T08:57:14.457 に答える
0

Ok。私は今それを理解しました..更新時にJOINSを使用する

お気に入り:

UPDATE messages JOIN contacts ON messages.email=contacts.email
SET messages.email = contacts.email
WHERE messages.email != contacts.email

それはかなり簡単です!

しかし...これが本当に私の投稿への回答であるかどうかはわかりません。私の質問は、効率の観点から「最善の方法」とは何かということです..

上記のクエリを 2000 レコードに対して実行すると、私のシステムは 4 秒間一時停止しました..いくつかの select 、php ループ、およびいくつかの update ステートメントを実行すると、より高速に感じました..

うーん

- - - アップデート - - - -

さて、私は先に進み、これをテストするために2つのスクリプトを作成しました..

驚くべきことに、私の QuadCore i7 Ivybridge マシンで

SQL JOINを介した単一の更新クエリは、複数のクエリとループのアプローチを実行するよりもはるかに遅くなります..

一方では、すべてのレコードを更新する必要がある 1000 レコードに対して上記の単純なクエリを実行しています...

スクリプトの実行時間は 4.92 秒でした! 私のマシンが一瞬ヒカップした..私のコアの1つで100%のスパイクに気づいた..

スクリプトへの後続の呼び出し (更新が必要なフィールドがない場合) には、同じ時間がかかりました! ばかげている..

反対側では、更新が必要なすべての行への SELECT JOIN クエリと、PHP の foreach() 関数でループされる単純な UPDATE クエリが含まれます。

スクリプトがすべての更新を実行するのに 3.45 秒かかりました。@ 約 50% のシングル コア スパイクと、後続のクエリで 1.04 秒 (更新が必要なフィールドがない場合)

ケースが閉じられました...

これがコミュニティに役立つことを願っています!

psこれは、「コーディング標準」に夢中になっているプログラマーといくつかのロジックについて議論したときに私が意味したことです..彼らの議論は、できれば「SQL側でそれを行う」ことです。彼らが言ったループでの評価と更新の方法は、「汚い」コードでした..おいおい。

于 2013-04-25T08:58:09.857 に答える