2010-12-03 8 views
0

は、私は私が行う場合(k1,k2,k3)
にインデックスm_idxを持って
SELECT c1,c2,c3... FROM tb FORCE INDEX (m_idx) WHERE k1=500 AND k2 IN(...) AND k2>2000 ORDER BY k1 LIMIT 1000;
OR
SELECT c1,c2,c3... FROM tb FORCE INDEX (m_idx) WHERE k1 IN (500,1000,1500 ...) AND k2 IN(...) AND k2>2000 ORDER BY k1 LIMIT 1000;
Handler_read_next = 999一番左のマルチインデックスで範囲で選択できますか?

しかし、私はK1に範囲を使用しようとします
SELECT c1,c2,c3... FROM tb FORCE INDEX (m_idx) WHERE k1>=500 AND k2 IN(...) AND k2>2000 ORDER BY k1 LIMIT 1000;
Handler_read_next = 58035
すべての場合において、使用されるキーはm_idx
しかし、私は3番目のケースではm_idxは使用されていないと思います(私もk1だけのインデックスを持っています)。
それ以外の場合は、1000行を超える理由を理解できません。
m_idxインデックスと、テーブルから読み取る条件を満たすONLY the first 1000行をスキャンする予定です。
実際、私は3番目のケースではインデックスをスキャンし、k1条件を満たす行はtbから読み込まれ、k3条件はtbから読み込まれた後にチェックされると考えています。
私はMyISAM、WINDOWS 7 64、tbは1ミルの行を持つMySqlを使用します。
私の質問は次のとおりです。
左端の複数のインデックスで範囲を選択することはできますか?
または
私は何か間違っていますか?
ありがとうございます。

答えて

0
  1. いいえ、それはありません。
  2. いいえ、あなたは右のすべてをやっている

http://dev.mysql.com/doc/refman/5.1/en/range-optimization.html(一部「複数のパートインデックスのための7.3.1.3.2。Rangeアクセスメソッド」)

だから、これを実行するには、オプティマイザを助けることができませんクエリはより速くなります。

オプティマイザは使用するインデックスをよりよく知っているので、FORCE INDEXは使用しないでください。また

:少数のレコードを返し、どちらかあなたのためにk1>=500またはk2 IN(...) AND k2>2000(私はなぜあなたがここに> 2000が必要なのですかわからないが、それを手動で比較することができ、前IN()に追加

k1>=500 AND k2 IN(...) AND k2>2000 

によってどの部分の)、インデックスk2を作成しようとすることもできます(k2部分がレコードの量を少なくした場合)。

+0

私はすでにその章を読んでいますが、それは不可能であると明言する必要はありませんでした。さらに、BTREEインデックスの場合、ANDと組み合わせた条件には区間が使用できる可能性があります。**各条件**は、=、<=>、IS NULLなどを使用してキー部分を定数値と比較します。 >、<, > =、<=, !=, <>、BETWEEN、またはLIKE'でもそうです:**各条件は**です。 – silversky

+0

@silversky:はい、**は**の可能性がありますが、あなたの場合はそうではありません。技術的には可能ですが、そのような種類のクエリではありません。"条件は、条件に一致するすべての行を含む単一のキータプルを判別することができる限り、間隔を使用できます" - これはキーフレーズです。このフレーズの直後のサンプルも見てください。それはあなたのものと全く同じです。 – zerkms

+0

@zerkmsこの文書が本当に悪いと言うなら、間違っているとは思わない。この章の最初の段落では、「複数部分インデックスの範囲条件は、インデックス行が1つまたは複数のキータプル間隔内に入るように制限します。」そして、後で(あなたが指摘したように)キータプル ' – silversky

関連する問題