- ベストアンサー
PHP + MySQL で登録時に重複チェックをする方法
- PHP + MySQL で大量のレコードを登録する際、重複チェックを効率的に行いたい場合について考えます。現在の方法では、配列を回しSELECT文で件数チェックを行っていますが、サーバーに負担が掛かる可能性があります。より効率的な方法についてご教示いただきたいです。
- PHP + MySQL で大量のレコードを登録する際に、重複チェックを効率的に行いたいと考えています。現在は配列を回しSELECT文で件数チェックを行っていますが、サーバーの負担が心配です。他に効率的な方法があれば、教えていただきたいです。
- PHP + MySQL を使用して大量のレコードを登録する際、重複チェックを行う方法について考えます。現在の方法では、配列を回しSELECT文で件数チェックをしていますが、サーバーに負担がかかるかもしれません。他の方法で負担を減らす方法があれば教えてください。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
他の方法の例として、 DBにて、"Title" をunique keyにして、登録時に、 INSERT IGNORE INTO table_name 構文を使ってINSERT する では如何でしょう。 Mysqlが、勝手に重複しいれば無視して、重複がなければ登録してくれます
その他の回答 (3)
- mudamuda546
- ベストアンサー率27% (37/136)
肝心なことを書き忘れた。 Titleがユニークキーの設定をしているならならINSERT IGNORE INTOを使えば重複キーに対しては挿入処理が行われないように処理できます。
- mudamuda546
- ベストアンサー率27% (37/136)
>1)重複チェックのSQL文を工夫する > 例) > × select * from bookshelf where Title='hoge'; > ○ select 1 from bookshelf where Title='hoge'; 普通にcount()関数使った方が良いですから >ただこれですと、どうしてもサーバーに負担が掛かってしまう気がするのです。 そうとうショボイサーバでなければ100件程度ならそれほど問題はないでしょう。
昨今のサーバーであれば、気にするほどの負荷ではないと思いますが、それでもあえて負荷を考えるとすれば、こんな対策くらいでしょうか。 1)重複チェックのSQL文を工夫する 例) × select * from bookshelf where Title='hoge'; ○ select 1 from bookshelf where Title='hoge'; データを取得する必要はないため、SELECT文の列名部分を固定値にすることで 負荷を若干軽減できます。 2)登録のSQL文を一括実行する ループのたびに1件1件実行するのではなく、実行して良い配列にマーク等をつけ、 最後に一括でinsert文を発行することで負荷を軽減します。 3)そもそも重複チェックをしない これはかなり強引な方法ですが、テーブルスキーマのほうでTitleをユニークな列 として構成し、登録プログラムでは重複チェックをせず、insert文を発行します。 当然、ランタイムエラーが発生するため、@mysql_queryというようにエラーを表示 しない工夫等が必要です。 いずれにせよ、サンプルプログラムを作って実際に実機でテストするのが一番です。たぶん、今のままでも危惧するほどの負荷はかかりませんよ。
お礼
これでうまくいきました!! ありがとうございました!