2016-05-08 20 views
0

かなり遅いされています。 ユーザーはこのデータベースのクエリがかなり遅いと訴えています。500000ユーザーDBは、私は次のような構造を持つデータベースを持っている

私たちのテストでは、ユーザーレコードの取得に約1.15秒かかることがわかりました。私は、データベース管理には専門家だ

SELECT * FROM users WHERE email = '[email protected]' 

: このテストは、次のクエリに基づいています。私は辞書のようにそれを使うときにどうやって取得するのか知っていますが、私はデータベースの最適化については考えていません。

私はいくつかの助けを得ることができたと思っていました。理想的には、1000万人のユーザーでもこのようにDBにクエリを実行できます。

誰もこのような単純なクエリを最適化するための提案はありますか?私は今すぐ何かを開いています。さらに論理的な方法があれば、データベースを再構築することさえできます。今のところ、登録された順序で注文されたばかりです。

+5

「電子メール」にインデックスを追加してください。 –

+0

また、「username」にインデックスを追加します。 –

+0

「インデックス」にインターネット上のリソースがあると仮定しています。私はそれが列の隣に数字を追加するだけではないと仮定しています。私は瞬時に報告します。みんなありがとう。 – user292010

答えて

2

MySQLにはパフォーマンスを向上させるための2つの重要な機能があります。あなたのタイプのクエリでは、500,000行または10,000,000行だけで大したことではありません。 NOSQLなどの他のテクノロジでも同じアクションを実行できますが、通常は自分のアプリケーションはデータベースのACIDプロパティに依存します。おそらくリレーショナルデータベースが正しい解決策です。

最初の機能は、他のところで説明したように、インデックスです。あなたのケースでは:

create index idx_users_email on users(email); 

指数はinsertdelete操作のためのオーバーヘッドが非常に少量のが発生します。しかし、索引では、並行照会を使用しても、行の検索は0.1秒以下になるはずです。

実行中の他のクエリによっては、他のインデックスが適切かもしれません。

第2の重要な機能は、テーブルのパーティショニングです。これは、usersテーブルでは必要ありません。ただし、トランザクションや他のタイプのデータには非常に便利です。

+0

ALTER TABLE 'users' ADD INDEX' email'( 'email')私にエラーを与えています。何バイトのインデックスを作成しますか? – user292010

+0

@ user292010どのようなエラーがありますか?見せてください。私はゴードンとあなたのやり方を1000万行のサンプルテーブルで試しました。両方の作業と両方ともSELECT時間を(私の場合は)〜3.5秒から0.00秒に減らします。つまり、MySQLは測定できません:-) – PerlDuck

+2

@PerlDog、もし 'email'がTEXT列ならば索引のキーの長さを指定する必要があります。 BTW: '電子メールはおそらくユニークです。 –

0

すでにコメントで述べたように、あなたは、インデックスを追加することもできますが、1に考えたのは自分自身を提示 - あなたは現在、その行のすべての情報を取得している - 必要なだけであるという情報を取得するクエリをターゲットに、より効率的です -

SELECT username FROM users WHERE email = '[email protected]'; 

また、セキュリティのためにPDOとバインドされたパラメータを調べる必要があります。

関連する問題