私は現在、次のようないくつかの (3) in 句を持つテーブルをクエリしようとしています:
SELECT *
FROM table
WHERE
a IN (2884,5320)
AND
b IN ('a', 'b', 'c')
AND
c IN (1, 2, 3)
AND d='abcd'
AND date BETWEEN 0 AND 1383177599
テーブルは次のようにインデックス付けされますindex(a, b, c, d, date)
ただし、クエリで Explain を実行すると、Explainer は使用する適切なインデックスがないことを示します。これは、私がFORCE INDEX
.
上記IN
のいずれかを次のように変更する=
と
SELECT *
FROM table
WHERE
a = 2884
AND
b IN ('a', 'b', 'c')
AND
c IN (1, 2, 3)
AND d = 'abcd'
AND date BETWEEN 0 AND 1383177599
MySQL では、強制的にインデックスを使用することができますが、それ以外の場合は別の非カバー インデックスを選択します。これは、どのIN
が に変更されたかに関係なく当てはまり=
ます。
私の質問:
インデックス付きクエリに使用できる in 句の数に制限はありますか? ここで私が見逃している明らかなものはありますか?
テーブルについて知っておくべきことがいくつかあります:
9 GB、~8,000,000 行。これには、非常に大きくなる可能性がある 1 つのテキスト列 (JSON フィールド) が含まれていますが、この列は上記のクエリ対象の列のいずれでもありません。上記の in 句は大幅に大きくなる可能性があります (200 ~ 300 アイテム)
ありがとう!
EDIT:
これはクエリの説明の出力です(with FORCE INDEX
)
1,"SIMPLE","table","ALL","correct_index",NULL,NULL,NULL,6977553,"Using where"
正しいインデックスは上記で説明したものです(index(a, b, c, d, date)
)