電子書籍の厳選無料作品が豊富!

質問させて頂きます。

PHPとMySQLを使用して、ユニークな値(10桁ほどの英数文字列)を持ったデータを、DBに大量に登録したいと考えています。1度に1万件ほどを想定しています。

その場合、
先に大量のデータを作成して、1件ずつユニークかのチェック→DBに登録(insert)といった方法や、
1件データを作成→ユニークチェック→DBに登録(insert)を繰り返す方法などあると思うのですが、
どのような方法が比較的DBに負荷をかけずに短い時間で行なうことが出来るでしょうか。

質問が大雑把になってしまい申し訳ありません。
自分なりに調べてはみたのですが、確認したサイトなどによって方法がバラバラでしたので、こちらで質問させて頂きました。

処理以外の部分でも、テーブルやカラムにこういった設定を行なうと良いなど、どのような情報でもよろしいので、ご教授頂けると幸いです。

また、上記の質問内容に不備な点がございましたら、申し訳ございません。


ご存じの方がいらっしゃいましたら、よろしくお願いいたします。

A 回答 (1件)

>ユニークな値(10桁ほどの英数文字列)を持ったデータを、DBに大量に登録したい


といっているのに

>1件ずつユニークかのチェック
しているのはなぜですか?
元データはユニークである保証がない、つまり
「ユニークな値を期待したデータ」でしかないということですか?

とりあえずデータを取り込むテーブルのユニークな値を保持するカラムに
unique属性(プライマリキーを含む)を設定するところからですね
一つ一つのデータのユニークをプログラム的に検証するのは
無駄が多いのでお勧めできません

それと、ユニークではないデータ(ダブったデータ)が来た時には
無視するか、上書きするかを決めないといけません。

無視する場合は、INSERT IGNORE INTO 構文
上書きする場合は、INSERT ON DUPLICATE KEY UPDATE 構文
を利用します。
http://dev.mysql.com/doc/refman/5.1/ja/insert.html
http://dev.mysql.com/doc/refman/5.1/ja/insert-on …

場合によっては元データがCSV形式であればLOAD DATA INFILE構文
がつかえるかもしれません
http://dev.mysql.com/doc/refman/5.1/ja/load-data …

元データを所定のルールで補完しながらデータを投入するのでしたら
やはりINSERT構文が基本です

総合的に考えるとPDOなどの互換性をもった仕組みを利用すると
多少の環境の変化にも対応できるとおもうのでお得です

またPHP+MySQLの場合はmysqliという仕組みが用意されていて
オブジェクト型・手続き型というアプローチの仕方があります。
それぞれ特性がありますので、やり方は多少ためしてみてから
決めた方がよいですが、一般にオブジェクト型の方が好まれるようです。
ちなみにmysql関数(iがつかないタイプ)を利用した解説書がまだ
販売していたりしますが、内容が古いので参考にしないほうがいいでしょう

データの持ち方についてはRDBの原則として正規化をしていると思いますので
それに合わせてデータ投入方法を考えないといけません
一度正規化について詳しく勉強したほうがいいかもしれませんね
    • good
    • 0
この回答へのお礼

返信が遅くなってしまい申し訳ありません。

「INSERT IGNORE INTO 構文」という方法があるのを知りませんでした。
PHP側で重複チェックを行なわなくてよくなったので、処理速度をあげることが出来ました。

またyambejp様がおっしゃられているように、まだまだ勉強不足な部分があるので、記述頂いた内容を参考に勉強したいと思います。

本当にありがとうございました。

お礼日時:2014/03/14 20:25

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

関連するカテゴリからQ&Aを探す