0

complex1(field2,field3)結果を検索して並べ替えるためtable1index order1(field10)インデックスがあります。これtable1は MySQL IndoDB テーブルです。サブクエリでは、インデックスを使用して値を取得しようとしcomplex1、メインクエリでは、order1インデックスを使用してそれらを並べ替え、最初の 50 のみを残します。

  EXPLAIN(
SELECT `t1`.`field1`,`t1`.`field10` from `database`.`table1` `t1` INNER JOIN 
   (SELECT `field1` FROM `database`.`table1` WHERE 
   `field2` >= 'val1' and `field2`<='val2' `and `field3` >= 'val3' and `field3`<='val4'
   ) as e1 
ON e1.`field1`=t1.`field1` ORDER BY t1.`field10` LIMIT 50)

結果は次のとおりです。

id  select_type table   type    possible_keys   key key_len ref rows    Extra
1   PRIMARY <derived2>  ALL NULL    NULL    NULL    NULL    13  "Using temporary; Using filesort"
1   PRIMARY t1  eq_ref  PRIMARY PRIMARY 4   e1.field1   1   
2   DERIVED table1  range   complex1    complex1    8   NULL    13  "Using where; Using index"

私が見るようにcomplex1、使用されてorder1いません。なんで?

4

1 に答える 1

0

MySQL には、インデックスの使用方法に関する優れたドキュメントがあります

サブクエリは、complexの範囲内のすべての値をスキャンしてインデックスを使用しますfield2field1が主キーである場合、それは InnoDB インデックスにもあるため (ここで説明されているように)、インデックスですべてのフィールドを満たすことができます。

次に、 に参加していfield1ます。このインデックスはテーブルに存在するため、MySQL はおそらくテーブルのプライマリ インデックスをこの結合に使用しています。したがって、結果は ではなくfield1で並べ替えられます。したがって、最終的な順序付けられた結果を取得するには、ファイルソートを実行する必要があります。 field10

が主キーの場合field1、このクエリは同じことを行いませんか?

SELECT `field1`, `field10`
FROM `database`.`table1`
WHERE `field2` >= 'val1' and `field2`<='val2' `and
      `field3` >= 'val3' and `field3`<='val4'
order by field10 desc
limit 30 
于 2013-04-20T15:45:55.330 に答える