は、私は私が行う場合(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を使用します。
私の質問は次のとおりです。
左端の複数のインデックスで範囲を選択することはできますか?
または
私は何か間違っていますか?
ありがとうございます。
私はすでにその章を読んでいますが、それは不可能であると明言する必要はありませんでした。さらに、BTREEインデックスの場合、ANDと組み合わせた条件には区間が使用できる可能性があります。**各条件**は、=、<=>、IS NULLなどを使用してキー部分を定数値と比較します。 >、<, > =、<=, !=, <>、BETWEEN、またはLIKE'でもそうです:**各条件は**です。 – silversky
@silversky:はい、**は**の可能性がありますが、あなたの場合はそうではありません。技術的には可能ですが、そのような種類のクエリではありません。"条件は、条件に一致するすべての行を含む単一のキータプルを判別することができる限り、間隔を使用できます" - これはキーフレーズです。このフレーズの直後のサンプルも見てください。それはあなたのものと全く同じです。 – zerkms
@zerkmsこの文書が本当に悪いと言うなら、間違っているとは思わない。この章の最初の段落では、「複数部分インデックスの範囲条件は、インデックス行が1つまたは複数のキータプル間隔内に入るように制限します。」そして、後で(あなたが指摘したように)キータプル ' – silversky