0

インデックスに 4 つのフィールドが必要な顧客テーブルを作成しています。これがテーブル構造です。

id、userName、status、email、password、fullName、joinDate (id は autoIncrement で主キー)

Index の 4 つのフィールドは、userName、status、email、password です。

実行する必要があるクエリは次のとおりです。

select id from table where status='active' and email='emailId' and password='pass' limit 1

select id from table where userName='user' and status='active' limit 1

select fullName from table where id='123' limit 1

これらすべてのクエリがインデックスに従うかどうかを知りたいですか? そうでない場合、インデックスが続くように構造を変更するにはどうすればよいですか? 私はmysqlとphpを使用しています。

ありがとう

4

2 に答える 2

0

私の推測では、「いいえ」、「はい」、「いいえ」の順です。しかし、質問に答えてパフォーマンスを測定するツールがあれば、当て推量はばかげています。

インデックスが続くように構造を変更するにはどうすればよいですか?

これは完全に逆です。データベース構造は、基本的にパブリック API です。構造を変更しないでください。インデックスを変更します。

以下は、適切に機能する可能性が高いクエリとインデックスです。(単一のインデックスに制限されているわけではありません。ただし、「うまく機能する可能性が高い」ということを信用しないでください。EXPLAIN で測定してください。)

select id 
from table 
where status='active' 
  and email='emailId' 
  and password='pass' limit 1;

create index on table (status, email, password);

最初の列 (userName) が WHERE 句で使用されていないため、このクエリ (上記) はおそらく既存のインデックスを使用しません。

select id 
from table 
where userName='user' 
  and status='active' limit 1;

インデックス内の列を実際の順序でリストしている限り、既存のインデックスをこのクエリに使用する必要があります。(WHERE 句の 2 つの列は、インデックスの最初の 2 つの列と一致します。) EXPLAIN で検証します。

select fullName 
from table 
where id='123' limit 1;

列「id」は主キーです。すでにインデックスがあります。

{status, email, password} にインデックスを追加するだけで「必要」のようです。

MySQL の複数列インデックス

于 2013-06-19T00:13:13.733 に答える