1

3 列のインデックスを持つ MyISAM テーブルがある場合、次のようなものです。

create table t (
  a int,
  b int,
  c int,
  index abc (a, b, c)
) engine=MyISAM;

問題は、次のクエリでインデックスを完全に利用できるかどうかです。

select * from t where a=1 and c=2;

言い換えれば、インデックスが b-tree であることを考慮して、MySQL は途中の列をスキップし、最初と最後の列でクイック検索を実行できますか?

EXPLAIN はインデックスが使用されることを示しているようですが、エクストラは次のように述べUsing where; Using indexています。これが実際に何を意味するのかわかりません。

4

2 に答える 2

3

答えはノーだ"。

インデックスの使用方法については、MySQL のドキュメントで明確に説明されています。

テーブルに複数列のインデックスがある場合、オプティマイザーはインデックスの左端のプレフィックスを使用して行を検索できます。たとえば、(col1、col2、col3) に 3 列のインデックスがある場合、(col1)、(col1、col2)、および (col1、col2、col3) にインデックス付き検索機能があります。 (http://dev.mysql.com/doc/refman/5.0/en/mysql-indexes.html)

何が起こるかというと、インデックスが「a=1」に使用されます。「c=2」が true かどうかを確認するために、一致するすべてのレコードが読み込まれます。フィルタは、インデックスと明示的なレコード フィルタリングの組み合わせを使用することになります。

ところで、2 つの列のすべての組み合わせを処理したい場合は、いくつかのインデックスが必要です。

  • (a、b、c)
  • (b、a、c)
  • (c、b、a)
于 2012-08-28T18:08:56.033 に答える
0

WHERE 句のすべての部分にインデックスを使用している場合でも、列が NULL になる可能性がある場合は where の使用が表示されることがあります。

ドキュメントによるMySQLと、上記のステートメントは、テーブルの列がnullになる可能性があることを明確にしているusing whereため、where句のフィールドのインデックスをカバーしていますが、同様に述べています。

http://dev.mysql.com/doc/refman/5.1/en/explain-output.html#explain-extra-information

于 2012-08-28T17:44:16.277 に答える