0

解決! @pilcrowが提案したことを行いました。mysql_error_num:1062 (一意の電子メール) を探し、そうであればエラーを返しました。

説明:

多くの異なるユーザーと、場合によっては企業が登録フォームからサインアップする必要があるアプリケーションを構築しています。info@company.com企業が一般的な電子メールを多くのユーザーに配布する可能性があるため、個人が入力した電子メールが一意であることを確認したいと考えています。

データベースと照合して、電子メールが存在するかどうかを確認できるようにしたいと考えています。

問題:

Javascriptを介してこれを達成する方法はすでに知っていますajaxPHP、多くの (数千の) ユーザーがいる場合、クエリに永遠に時間がかかるのではないかと心配しています。特に、フォームkeypressのイベントの代わりにイベントを使用することにしたblur場合。私は間違っているかもしれませんが、シンプルなWHERE email = $emailものが非常にスケーラブルであることはわかりません。

質問

クエリを高速化するためにコードまたはデータベース (mysql) を設定する方法はありますか? メール専用のテーブルを別に作ろうと思っていたのですが、うまくいかないと思います。

ありがとうございました!

ps私はデータベース/サーバーテクノロジーにかなり慣れているので、そうPHPですMYSQL

4

2 に答える 2

1

あなたの質問は、データベースに何を保存するかについてかなり曖昧です。メール用に別のテーブルを使用することの欠点は何ですか?

あなたが本当に必要としているのは、表ではなく、電子メールの索引です。基になるテーブルは電子メールのみである場合もあれば、追加のユーザー情報が含まれている場合もあります。ただし、次のようなクエリを実行すると、次のようになります。

 select email
 from t
 where email = <your email to check>
 limit 1

次に、クエリはインデックスを効率的に使用して照合を行います。

于 2012-08-28T16:41:14.907 に答える
1

あなたが尋ねる

クエリを高速化するためにコードまたはデータベース (mysql) を設定する方法はありますか?

はい、クエリを完全に省略します。

バックエンド データベースに保存されている電子メール アドレスに UNIQUE 制約を設定し、電子メール アドレスの重複が原因で新しいアカウントの INSERTion が失敗したときに ER_DUP_UNIQUEをキャッチする準備をします。

このアプローチにより、重複が防止され、重複が選択されたときに新しいユーザーに警告が表示されます。

電子メール アドレスを入力するときに検索する必要があるとは思えません ( 「...イベントを使用することにしたkeypress場合...」 )。INSERT を実行する前にアドレスが存在することを本当に確認したい場合は、TOCTOUの陽気さを防ぐためのトランザクションも必要になります。ただし、 UNIQUE 制約は重複に対する最も単純だが最も効果的な防御であるため、それを実装するだけです。

于 2012-08-28T16:58:59.607 に答える