QA@IT

MySQLデータベースを効率的に書き換えたい

3122 PV

複数のユーザーが存在するMySQLベースの簡易SNSのようなものがあり、
楽曲データベースの中からユーザーごとに最大5曲までピックアップして表示できるようにしたいんですが、
テーブル構造を「ユーザーID/楽曲ID/順序」とした場合、順序の入れ替えや楽曲の差し替えが発生した時
そのユーザーの全部のレコードの順序を書き換えることになりますが、
SELECT でユーザーの楽曲を全て取得しておいてユーザIDと楽曲IDの複合主キーをもとに
一曲ごとに UPDATE や DELETE していくのが正しいですか?

回答

MySQLのUPDATE文は結合可能なので、割と複雑な更新を一括で行うことはできます。
下記に使用例があります。

http://qiita.com/masuidrive/items/0671ea7efa91a99c0268
http://okwave.jp/qa/q7079569.html

見ていただくと分かりますが、更新後の情報を既存の他のテーブルから取得できればよいのですが、そうでなければ一時テーブルを作成するなり、長ったらしいインラインビューなりを書く必要があります。
そういう書き方が効率的かと言えば、ちょっと違う気がしますね。

いずれにしろUPDATEとDELETEは別々に発行する必要がありますし、普通に一件ずつSQL発行でいいんじゃないでしょうか。
あんま最初から効率とか考えない方がいいと思いますよ。

編集 履歴 (0)
  • UPDATE を一時テーブルをもとに行うとして、どれを削除してどれを更新するかは、あらかじめ SELECT で取得したものをもとに判断するのですか?
    一時テーブルに存在しない楽曲は一括で削除する良い方法があればいいのですが、そう考えると確かに一件ずつ処理するやり方のほうが無難な気がしますね。
    -
  • 一時テーブルに、「どれをどのように更新するのか」という情報を記録しておいて使用するのです。この一手間をかける意味があれば良いのですが、無いことの方が多いと思います。削除は「一時テーブルに存在しない」という条件だけでいいのであれば、一回のDELETE文発行で削除できます。 UPDATE文とDELETE文が5〜10本発行される程度なら、素直に一本ずつ発行した方が良いのではないでしょうか。
    -
  • コメントありがとうございます。
    今回は規模が小さいこともあるので1つずつ処理する形で行くことにします。今後のために一時テーブルに基づいた方法も勉強してみようと思います。
    -
ウォッチ

この質問への回答やコメントをメールでお知らせします。