家の中でのこだわりスペースはどこですか?

はじめまして。お世話になります。
LAMPでWEBシステムを作成しております。
ランダムな文字列をDBにINSERTする処理に関して質問させて頂きます。

条件:
・DBに入るランダムな文字列は重複不可。
・ランダムな文字列は[a-zA-Z0-9]の10桁とする。
・1度の処理で、ランダムの文字列は確実にINSERTさせる。
・同時に多数の処理が走ることがある。
・処理は速いに越したことない(DBの負荷も低めがよい)

環境:
PHP 4.4.4
Mysql 5.0.33
使用ストレージエンジン:MyIsam

私が思いついたのが以下の2通りです。

(1)
ランダム文字列が入るカラムをユニークキーとし、PHP側で作成されたランダム文字列をINSERT。
重複していたらエラーが返ってくるが、正常にINSERTされるまでPHP側でループ。

(2)
対象テーブルをロックし、PHP側で作成されたランダムの文字列をSELECT。
なければその文字列をINSERTし、テーブルロック解除

(1)はループが少し怖く、(2)はDBへの負荷がかかってしまいそうですが
どちらがよいでしょうか?
もしくは、他に何か方法があればご教授頂けるとありがたいです。

また、現在MyIsamを使用しておりますが、場合によってはストレージエンジンの変更も
考えておりますのでその点も考慮して頂けると幸いです。
ちなみに検索条件は、ランダムの文字列をキーに全てのデータを取得するくらいです。
そのテーブルは、カラム数15、レコード数1,000万の見込みです。

以上、長くなりましたがよろしくお願いします。

A 回答 (2件)

予め、ランダムデータ用テーブルを1000万データ分作っておいて、


(まぁナンでしたら余裕をもって1億データくらいつくっておいてもよいかも)
新たにAUTO INCREMENTなどで振られたIDをもとに
そのテーブルからランダムデータを渡してあげればよいのでは?
ループでトライをする方式は場合によってはオーバーヘッドが
致命的になる場合もありますので。

メインテーブルにAUTO INCREMENT用テーブルが仕様上作成できないなら
ランダムデータ用テーブルの方にフラグフィールドをつくっておき
データを吐き出した時点でフラグをたてておけば、フラグのたってない
データを渡すというやり方も考えられます。

まぁランダム用テーブルをつくるにあたっては、ループでトライアンド
エラーでやることになりますが、データを作成するたびにトライするよりは
ずいぶんすっきりすると思います

この回答への補足

Mysqlの分野のほうが近いような気がしますので、一旦締め切ります。
改めまして、再度Mysql板のほうで質問させて頂きます。
ありがとうございました。

補足日時:2007/04/17 16:56
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
ご提示頂いた実際の流れは、メインテーブルにINSERTする際にランダム文字列を取得する処理を考えた場合、
以下の流れでよろしいでしょうか?

[DB部]
ランダム文字列を格納するテーブルRAND_TBL(rand_seq_id int AUTO_INCREMET primary key, rand_id varchar(10) unique key)を作成、
必要分のデータををあらかじめ挿入。
メインテーブルMAIN_TBL(seq_id int AUTO_INCREMENT primary key, ....)作成

[処理部]
メインテーブルへデータを挿入後、
"SELECT rand_id FROM RAND_TBL WHERE seq_id = ".mysql_insert_id();で取得

また、ランダム文字列をキーにMAIN_TBLからデータを取得する際に少しめんどくさそうなので、
できればメインテーブルにもランダム文字列を入れたいのですが、その後UPDATEしかないのでしょうか?

PHPというより、Mysql分野に近くなってきましたが、何卒よろしくお願いします。

お礼日時:2007/04/15 00:51

私なら、ユニーク文字列を


$id = md5 (uniqid (rand()));
として、32桁で返します。

実装が簡単ですよ。

参考URL:http://jp.php.net/manual/ja/function.md5.php
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
ご提示頂いた
$id = md5 (uniqid (rand()));
としますと、完全に重複することはないのでしょうか?
可能性がわずかでもある場合は何かしらの処理が必要かと思われますので。

また、一応条件に、文字列は10桁(バイト数)とありますので、
できましたらこれに沿って頂けると助かります。

お礼日時:2007/04/14 11:33

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


おすすめ情報