アプリ版:「スタンプのみでお礼する」機能のリリースについて

単純なパラメタのコマンドを複数回実行する場合と、
多くのパラメタを使ってコマンドの実行回数を減らす場合で、
処理時間(呼び出してから処理完了まで)に違いはありますか?

具体的には、50項目のレコードが10000程度あるテーブルの
 一部のレコード修正(100レコード中の300項目程度)と、
 新規レコード10件程度の追加
を行う場合です。

方法Bを思いついたのですが、パラメタが長くなってしまい、呼び出し回数を減らしたメリットが本当にあるのか
疑問に思ったので教えてください。
もちろん、たかだか1回の呼び出し軽減できただけなので、それほど効果は変わらない気もしますが、興味あるので教えてください。
また、ストアドファンクションを定義して呼び出し回数を減らす方法も思いついたので、これもメリットもあるのかが知りたいです。

<方法A>
更新するレコードをDELETEコマンドで削除して、INSERTコマンドで加筆・編集する
<方法B>
INSERT の ON DUPLICATE KEY UPDATE コマンド1回で実行する
<方法C>
方式Aのストアドファンクションを定義しておいて、DELETEコマンド用のパラメタ、INSERTコマンド用のパラメタを与える

A 回答 (3件)

> 修正のあるレコードを削除して、修正後の内容をインサートするほうが素直な気がしました。



いやそれは誤解です
以下試してみてください

create table tbl(id int primary key,val1 varchar(10),val2 int);
insert into tbl values
(1,'aaa',100),
(2,'bbb',200),
(3,'ccc',300);

replace into tbl values(1,'xxx',1000),(4,'yyy',2000);

id=1は書き換えられ、2,3はそのまま、4は追加されるのがわかります
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

>いやそれは誤解です
失礼しました。
replace関数でなく、replace構文ですね。

13.2.8 REPLACE 構文
https://dev.mysql.com/doc/refman/5.6/ja/replace. …

REPLACE は、INSERT とまったく同じように機能します。ただし、テーブル内の古い行に、PRIMARY KEY または UNIQUE インデックスに関して新しい行と同じ値が含まれている場合、その古い行は新しい行が挿入される前に削除されます。

やりたいことそのものズバリの構文があったのですね。
いろんな解説読んでも、
 SELECT文:レコード検索
 INSERT文:レコード挿入
 UPDATE文:レコード更新
 DELETE文:レコード削除
の4つの構文を組み合わせたり、パラメタを工夫する記事しか見つからなかったので replace 構文知りませんでした。

>mysqlの場合replaceという書式が用意されています
MySQL以外のDBでは replace 使えない場合もあるようですね。そのため、一般の解説記事にはreplace は記載されていないのですね。

replace構文使えば、
INSERT - ON DUPLICATE KEY UPDATE
の直後の全ての項目について指示は不要ですね。

はじめの疑問の処理速度の差異については相変わらず未解決ですが、
別の意味では、スッキリしました。

お礼日時:2020/05/19 07:12

すべてのデータを入れ替える前提ならmysqlの場合replaceという書式が用意されています

    • good
    • 0
この回答へのお礼

回答ありがとうございます

replaceコマンド、今調べましたが、

SQL REPLACE関数とは、対象文字列やカラムの中から指定した文字を別の文字に置き換えることができる関数のことです。SQL REPLACE関数の構文は以下の通りです。
SELECT REPLACE(対象文字列・カラム, 指定した文字, 置き換えたい文字);

とあり、今回の

>具体的には、50項目のレコードが10000程度あるテーブルの
> 一部のレコード修正(100レコード中の300項目程度)と、
> 新規レコード10件程度の追加
>を行う場合です。

での適用には無理がありそうな気がします。例えば同じ文言が複数箇所あった場合、修正したいレコード以外の当該文言も修正されてしまう事故が怖い気がします。
それより、修正のあるレコードを削除して、修正後の内容をインサートするほうが素直な気がしました。

お礼日時:2020/05/18 13:35

> パラメタが長くなってしまい



の定義がわからないですが、方法Bで問題ないでしょう。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

方法Bで問題ないことはわかっていますが、今回は、処理時間についての質問です。

> パラメタが長くなってしまい
ON DUPLICATE KEY UPDATE
の直後に50行に渡り
 id = VALUES(id),
 name = VALUES(name),
  :
と全ての項目について、指示を出さないといけない点です。

こんなにたくさんの指示を出すと、処理が重くなりはしないのかな、という素朴な疑問です。
単純に書き換えるレコードを削除してから、INSERTコマンドで加筆するほうが2回のコマンドになりますが、この方が早いのでは?
呼び出しが足を引っ張るなら、ストアドファンクションにすれば、もっと早くなるのかしらという疑問です。

お礼日時:2020/05/18 11:58

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!