この場合、RANGE
を使用するため、インデックスを使用できません。 フィルタリング条件。
次のようなものを使用する場合:
SELECT *
FROM values_table this_
WHERE this_.value1 = @value
ORDER BY
value2
LIMIT 10
、次に(VALUE1, VALUE2)
に複合インデックスを作成します フィルタリングと注文の両方に使用されます。
ただし、遠隔条件を使用するため、とにかく注文を実行する必要があります。
複合インデックスは次のようになります:
value1 value2 ----- ------ 1 10 1 20 1 30 1 40 1 50 1 60 2 10 2 20 2 30 3 10 3 20 3 30 3 40
、および1
を選択した場合 および2
value1
で 、まだvalue2
のソートされたセット全体を取得することはできません 。
value2
のインデックスの場合 あまり選択的ではありません(つまり、DISTINCT value2
は多くありません 表内)、次のことを試すことができます:
CREATE INDEX ix_table_value2_value1 ON mytable (value2, value1)
/* Note the order, it's important */
SELECT *
FROM (
SELECT DISTINCT value2
FROM mytable
ORDER BY
value2
) q,
mytable m
WHERE m.value2 >= q.value2
AND m.value2 <= q.value2
AND m.value1 BETWEEN 13123123 AND 123123123
これはSKIP SCAN
と呼ばれます アクセス方法。 MySQL
直接サポートしていませんが、このようにエミュレートできます。
RANGE
この場合、アクセスが使用されますが、DISTINCT value2
でない限り、パフォーマンス上のメリットはおそらく得られません。 約1%
未満で構成されます 行の。
使用法に注意してください:
m.value2 >= q.value2
AND m.value2 <= q.value2
代わりに
m.value2 = q.value2
これにより、MySQL
が作成されます RANGE
を実行します 各ループをチェックします。