2

次の構造のappsテーブルがあります

app_id VARCHAR(32) NOT NULL, 
dormant VARCHAR(6) NOT NULL, 
user_id INT(10) NOT NULL UNSIGNED

このテーブルには 2 つのインデックスがあります -:

combo1(UNIQUE) - app_id, user_id; 
combo2(INDEX) - app_id, dormant, user_id

このクエリを実行します

EXPLAIN SELECT COUNT(user_id), 
      IF(user_id=1,'yes','no') FROM apps 
      WHERE app_id='app_2' AND dormant = 'false'

次の情報を出力します -:

id -> 1; 
type -> SIMPLE; 
table -> apps; 
possible_keys -> combo1, combo2; 
key -> combo2; 
key_len -> 34; 
ref -> const; 
rows -> 1; 
Extra -> Using where

しかし、このクエリを実行すると

EXPLAIN SELECT COUNT(user_id), 
    IF(user_id=1,'yes','no') 
FROM apps USE INDEX(combo2) 
WHERE app_id='app_2' AND dormant = 'false'

次の情報を出力します -:

id -> 1; 
type -> SIMPLE; 
table -> apps; 
possible_keys -> combo2; 
key -> combo2; 
key_len -> 42; 
ref -> const,const; 
rows -> 1; 
Extra -> Using where; Using index

Using indexどちらの場合も同じインデックスを使用しているのに、なぜ 2 回目に言っているのでしょうか?

4

2 に答える 2

1

コメントからの質問に答えます:クエリを書き直して、次の場合だけでなく機能するようにする方法user_id=1

SELECT
   COUNT(user_id) as distinct_user_count,
   IF(SUM(user_id=@user_id), 'yes', 'no') as is_the_user_found
FROM apps 
WHERE app_id='app_2' AND dormant = 'false';
于 2013-02-08T13:00:22.413 に答える
1

MySQL ドキュメントから:

列情報は、実際の行を読み取るために追加のシークを行うことなく、インデックス ツリー内の情報のみを使用してテーブルから取得されます。この戦略は、クエリが単一のインデックスの一部である列のみを使用する場合に使用できます。

Extra 列にも Using where と表示されている場合は、キー値の検索を実行するためにインデックスが使用されていることを意味します。Using where を使用しない場合、オプティマイザーはデータ行の読み取りを回避するためにインデックスを読み取っていても、ルックアップには使用していない可能性があります。たとえば、インデックスがクエリのカバリング インデックスである場合、オプティマイザはルックアップに使用せずにスキャンすることがあります。

詳細については、こちらを参照してください。

于 2013-02-08T07:57:28.003 に答える