5

私は簡単なテーブルを持っています->

id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY
by_id INT UNSIGNED NOT NULL
posted_on INT UNSIGNED NOT NULL

私のテーブルエンジンはMyISAMです。

複数の列のインデックスが必要combo1ですby_id,posted_on,id

このクエリを実行します->

EXPLAIN SELECT * FROM books 
        WHERE by_id = '1' AND posted_on = '0' 
        ORDER BY id DESC LIMIT 7;

Extraコラムは言うそしてUsing whereキーコラムは言うcombo1

しかし、私がこのクエリを実行すると->

EXPLAIN SELECT * FROM books 
        WHERE by_id IN(1,7,10) AND posted_on = '0' 
        ORDER BY id DESC LIMIT 7;

Extra列にはが表示さUsing where; Using filesortれ、キー列にはが表示されますcombo1

filesortQEPは、オプティマイザが「id」インデックスが付けられたインデックスcombo1を使用していることを示しているのに、なぜ2番目のケースで発生するのですか。

4

1 に答える 1

6

インデックスはB+ツリーです。つまり、by_id 1の下には、posted_on0とby_id1のすべてのレコードがあり、それらのレコードのすべてのIDがあります。ただし、by_id 7の下には、posted_on 0のレコードを含み、IDのレコードを含む別のツリーブランチがあります。

in句がある場合、ツリーの3つの異なるブランチを取得する場合、それらをマージして再配置する必要があります。これは、1,2,4のIDがby_id 1の下にある可能性があるが、3,5がby_id10の下にある可能性があるためです。MySQLは1、2、4、3、5を取得し、それらを再利用する必要があります。

最初のケースでは、ブランチは1つだけで、各ブランチはすでにソートされています

于 2013-02-21T07:36:10.493 に答える