4

誰かが違いを知っていますか

インデックスの使用

whereを使用する; インデックスの使用

mysqlのexplain出力(Extra)で?

再生:

CREATE TABLE `tmp_t1` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `a` int(11) NOT NULL DEFAULT '0',
  `b` varchar(50) CHARACTER SET latin1 NOT NULL DEFAULT '',
  PRIMARY KEY (`id`),
  KEY `k1` (`a`),
  KEY `k2` (`b`)
) ENGINE=InnoDB AUTO_INCREMENT=5;

insert into tmp_t1 (a,b) values (1,'b1'), (1, 'b2'), (2, 'b3');

mysql> Explain select count(1)from tmp_t1 where a = 1 \ G

*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: tmp_t1
         type: ref
possible_keys: k2,kz
          key: kz
      key_len: 4
          ref: const
         rows: 3
        Extra: Using index
1 row in set (0.11 sec)

mysql> Explain select count(1)from tmp_t1 where b ='b1' \ G

*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: tmp_t1
         type: ref
possible_keys: k3
          key: k3
      key_len: 52
          ref: const
         rows: 2
        Extra: Using where; Using index
1 row in set (0.00 sec)

最初のケースでは追加フィールドに「インデックスの使用」しかなく、2番目のケースでは「どこで使用;インデックスを使用」である理由を誰かが知っていますか?ケースの違いは、最初のケースは整数でWHEREを実行し、2番目のケースはvarchar(50)フィールドで実行されることです。しかし、なぜそれが重要なのですか?

ご協力いただきありがとうございます!

4

3 に答える 3

3

違いが確かに非常に紛らわしいことを確認する必要があります。その他の場合Using where; Using indexは、インデックスが使用されているが、完全にスキャンされていることを意味する場合があります。(a、c)に複合インデックスがあるが、のようなクエリを作成する場合と同じSELECT a FROM thetable WHERE c = 1です。この場合、MySQLはインデックスを使用します(必要なすべてのデータが含まれ、メモリ内にあるため)が、インデックスを完全にスキャンします。

結果として、次の変数が表示されます。

SHOW STATUS LIKE 'Handler_read_next';

テーブル内の行数に増加します。

しかし、これはクエリには当てはまりません。

select count(*) from tmp_t1 where b='b1';

インデックス内の正確な行数を調べます。これはある種のバグまたは機能であり、結果のEXPLAIN自体があまり依存するものではないことを示すもう1つの証拠だと思います。興味深いのは、より大きなテーブルでのクエリの場合、およびVARCHARがインデックスの2番目である複合インデックスでは、がEXPLAIN表示されない場合があることUsing whereです。私は混乱しています。

于 2012-01-24T17:17:14.573 に答える
0

場所の使用

WHERE式(可能なキールックアップに加えて)は、行が受け入れられるべきかどうかをチェックするために使用されます。'Using where'と結合タイプALLがない場合は、おそらく何か問題があります。

インデックスの使用

テーブルから必要な情報を取得するために使用されるのはインデックスのみです。実際のレコードを取得するために追加のシークを実行する必要はありません。

于 2012-01-24T12:01:25.210 に答える
0

「インデックスの使用」とは、実際のクエリ(返す行の検索)を実行するためにインデックスのみが使用されることを意味します。つまり、mysqlは実際の行を読み取る必要がありません。

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

「whereを使用する」とは、データ検索を実行するときにインデックスも使用されることを意味します(返す必要のある行については、選択した列に対応するデータを検索します)。

[追加]列に[使用場所]と表示されている場合は、インデックスがキー値のルックアップを実行するために使用されていることを意味します。whereを使用しない場合、オプティマイザはデータ行の読み取りを回避するためにインデックスを読み取りますが、ルックアップには使用しません。たとえば、インデックスがクエリのカバーインデックスである場合、オプティマイザはルックアップに使用せずにそれをスキャンする場合があります。

mysqlのドキュメントのソース(「usingindex」を検索)

于 2012-01-24T12:02:02.027 に答える