
はじめまして。お世話になります。
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万の見込みです。
以上、長くなりましたがよろしくお願いします。
No.2ベストアンサー
- 回答日時:
予め、ランダムデータ用テーブルを1000万データ分作っておいて、
(まぁナンでしたら余裕をもって1億データくらいつくっておいてもよいかも)
新たにAUTO INCREMENTなどで振られたIDをもとに
そのテーブルからランダムデータを渡してあげればよいのでは?
ループでトライをする方式は場合によってはオーバーヘッドが
致命的になる場合もありますので。
メインテーブルにAUTO INCREMENT用テーブルが仕様上作成できないなら
ランダムデータ用テーブルの方にフラグフィールドをつくっておき
データを吐き出した時点でフラグをたてておけば、フラグのたってない
データを渡すというやり方も考えられます。
まぁランダム用テーブルをつくるにあたっては、ループでトライアンド
エラーでやることになりますが、データを作成するたびにトライするよりは
ずいぶんすっきりすると思います
この回答への補足
Mysqlの分野のほうが近いような気がしますので、一旦締め切ります。
改めまして、再度Mysql板のほうで質問させて頂きます。
ありがとうございました。
ご回答ありがとうございます。
ご提示頂いた実際の流れは、メインテーブルに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分野に近くなってきましたが、何卒よろしくお願いします。
No.1
- 回答日時:
私なら、ユニーク文字列を
$id = md5 (uniqid (rand()));
として、32桁で返します。
実装が簡単ですよ。
参考URL:http://jp.php.net/manual/ja/function.md5.php
ご回答ありがとうございます。
ご提示頂いた
$id = md5 (uniqid (rand()));
としますと、完全に重複することはないのでしょうか?
可能性がわずかでもある場合は何かしらの処理が必要かと思われますので。
また、一応条件に、文字列は10桁(バイト数)とありますので、
できましたらこれに沿って頂けると助かります。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
phpのheader("Location:#pos")...
-
PHPのエラーの解消法について教...
-
セッション関数を使わずにファ...
-
PHP8でWarning:Undefined varia...
-
composerをインストールしたい...
-
フォームで戻った際に入力済み...
-
SplFileObject を利用したとき...
-
phpの問い合わせフォームを作っ...
-
marginの値でマイナス値を設定...
-
submitで思うようにページが遷...
-
HTML PHP ラジオボタンのイベント
-
php でqiitaのサイトにあったフ...
-
PHPの勉強してます。 配列のと...
-
BASIC認証のフォームをデザイン...
-
アップロードファイルを表示す...
-
複数のパソコンの中の1つのパソ...
-
返信機能のツリー構造の深さを...
-
PHPについて。
-
PHPからCSVをアップロード後、m...
-
[php初心者]サイトを見てデータ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
MySQLでデータベースにデータin...
-
トランザクション処理
-
csvをDBへ読み込んだら、NULLが...
-
ヒアドキュメントでSQLを書く事...
-
OracleからAccessへのインポート
-
変数にNULLを代入したい
-
【PHPとDBの連動】時刻表作成
-
php sqlite count 列数取得
-
RFC822形式での日時の取得
-
MySqlのテーブルのサイズを取得...
-
セレクト文について
-
MDB2エラーが対応出来ません。
-
DB Error: no such field
-
会員サイトでログイン後の会員...
-
PHPでフォームからデータDBに書...
-
月毎の集計値を同じデータグリ...
-
クエリObjectをforeachで回す時...
-
MySQLでの売上集計
-
出勤表の作り方
-
phpでテーブルを作る際変数によ...
おすすめ情報