70

クエリは次のとおりです。

SELECT * FROM table WHERE accountid = 1 ORDER BY logindate DESC LIMIT 1

ここで、フィールドに複数の列を持つインデックスを追加した場合:

INDEX(accountid,logindate)

MySQLはこの複数列のインデックスを利用しますか?または、一方のフィールドがwhere句にあり、もう一方のフィールドがorderステートメントにあるため、使用しないのでしょうか。または、複数列のインデックスの順序でフィールドを使用する限り、問題ではありませんか?

4

1 に答える 1

67

良い質問。

インデックスは左から右に機能するため、WHERE条件はインデックスを使用します。この場合、並べ替えはインデックスも利用します (以下の実行計画)。

マニュアルから:

がインデックスと正確に一致しない場合でもORDER BY、インデックスの未使用部分とすべての余分な列が句ORDER BY内の定数である限り、インデックスを使用することもできます。WHERE次のクエリは、インデックスを使用してORDER BYパーツを解決します。

SELECT * FROM t1
WHERE key_part1=constant
ORDER BY key_part2;

単一の列インデックス ( accountid) がある場合は、代わりにファイルソートが使用されます。したがって、クエリはそのインデックスの恩恵を受けます。


2 列のインデックス

create table t1 (
  accountid tinyint,
  logindate date);

create index idx on t1 (accountid, logindate);

insert into t1 values (1, '2012-09-05'), (2, '2012-09-09'), (3, '2012-09-04'), 
    (1, '2012-09-01'), (1, '2012-09-26'), (2, '2012-05-16'), 
    (1, '2012-09-01'), (3, '2012-10-19'), (1, '2012-03-01')

実行計画

ID SELECT_TYPE テーブル タイプ POSSIBLE_KEYS KEY KEY_LEN REF ROWS FILTERED EXTRA
1 SIMPLE t1 ref idx idx 2 const 5 100 where を使用します。インデックスの使用

単一列インデックス

create table t1 (
  accountid tinyint,
  logindate date);

create index idx on t1 (accountid);

insert into t1 values (1, '2012-09-05'), (2, '2012-09-09'), (3, '2012-09-04'), 
    (1, '2012-09-01'), (1, '2012-09-26'), (2, '2012-05-16'), (1, '2012-09-01'), 
    (3, '2012-10-19'), (1, '2012-03-01')

実行計画

ID SELECT_TYPE テーブル タイプ POSSIBLE_KEYS KEY KEY_LEN REF ROWS FILTERED EXTRA
1 SIMPLE t1 range idx idx 2 5 100 where を使用。ファイルソートの使用
于 2012-10-04T13:59:56.840 に答える