はじめまして。お世話になります。
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を探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・チョコミントアイス
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・あなたの習慣について教えてください!!
- ・ハマっている「お菓子」を教えて!
- ・高校三年生の合唱祭で何を歌いましたか?
- ・【大喜利】【投稿~11/1】 存在しそうで存在しないモノマネ芸人の名前を教えてください
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・家の中でのこだわりスペースはどこですか?
- ・つい集めてしまうものはなんですか?
- ・自分のセンスや笑いの好みに影響を受けた作品を教えて
- ・【お題】引っかけ問題(締め切り10月27日(日)23時)
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・架空の映画のネタバレレビュー
- ・「お昼の放送」の思い出
- ・昨日見た夢を教えて下さい
- ・ちょっと先の未来クイズ第4問
- ・【大喜利】【投稿~10/21(月)】買ったばかりの自転車を分解してひと言
- ・メモのコツを教えてください!
- ・CDの保有枚数を教えてください
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・10秒目をつむったら…
- ・人生のプチ美学を教えてください!!
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
BASIC認証のフォームをデザイン...
-
awsにApacheとPHPを入れて、何...
-
返信機能のツリー構造の深さを...
-
phpでcookieがうまく保存されない
-
「基礎からのMySQL 第3版 Kindl...
-
SQLとPHPの連結方法がわからな...
-
アップロードファイルを表示す...
-
複数のパソコンの中の1つのパソ...
-
PHPについて。
-
phpのheader("Location:#pos")...
-
PHPからCSVをアップロード後、m...
-
[php初心者]サイトを見てデータ...
-
phpに関わる所での、form actio...
-
ゆゆにゃ。
-
【初心者】XAMPPのapacheの(恐...
-
プログラミング言語で、使える...
-
こちらはただの直列処理ですか?
-
PHPでこのコード自体に意味は無...
-
PHPとHTML+Xamppの掲示板で画像...
-
phpでPEAR::DBを使っているので...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
MySQLでデータベースにデータin...
-
csvをDBへ読み込んだら、NULLが...
-
変数にNULLを代入したい
-
phpにて出欠登録管理を作成して...
-
OracleからAccessへのインポート
-
php sqlite count 列数取得
-
DB Error: no such field
-
日またぎの計算
-
SQLiteでDBに書き込みできません
-
出勤表の作り方
-
Accessへ日付をINSERT
-
PHPとMySQLを使った検索システ...
-
テーブルの数
-
結合したテーブルの特定カラム...
-
PHPでmySQLのテーブルを作成したい
-
PHP データの抽出&相関検定の...
-
SQLで返り値が空とでる
-
phpでテーブルを作る際変数によ...
-
【PHPとDBの連動】時刻表作成
-
メニューの階層について
おすすめ情報