OR
Handler_read_next=999 を実行m_idx
する(k1,k2,k3)
場合のインデックスがあります
SELECT c1,c2,c3... FROM tb FORCE INDEX (m_idx) WHERE k1=500 AND k2 IN(...) AND k2>2000 ORDER BY k1 LIMIT 1000;
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;
しかし、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
すべての場合でEXPLAINは、使用されるキーはであると言いm_idx
ますが、3番目のケースm_idx
では使用されていないと思います(k1にのみインデックスがあります)。
そうでなければ、なぜそれが1000行以上を読んでいるのか理解できません。インデックスと、テーブルから読み取られる条件を満たす行
をスキャンすることを期待していました。
しかし実際には、3番目のケースではインデックスをスキャンし、k1条件を満たす行がtbから読み取られ、行がtbから読み取られた後にk2とk3の条件がチェックされると思います。
私が使用するもの:MySql with MyISAM、WINDOWS 7 64、tbには100万行あります。
だから私の質問は:
左端のマルチインデックスの範囲で選択することは可能ですか?m_idx
ONLY the first 1000
または
私は何か他のことをしているのですか?
ありがとうございました。