リンゴとオレンジを比較しているので、このような比較は意味がありません。
これらの2つのクエリは同等ではなく、異なる結果をもたらします。
したがって、MySqlは異なる方法でそれらを最適化します。計画は異なる場合があります。
次の簡単な例を参照してください: http:/ /sqlfiddle.com/#!9/98678/2
create table account_range(
is_active int,
range_start int,
range_end int
);
insert into account_range values
(1,-20,100), (1,10,30);
最初のクエリは2行になります:
select * from account_range
where is_active = 1 and 25 between range_start AND range_end;
| is_active | range_start | range_end |
|-----------|-------------|-----------|
| 1 | -20 | 100 |
| 1 | 10 | 30 |
2番目のクエリは1行のみを提供します:
SELECT * FROM account_range
WHERE
is_active = 1 AND
range_start = (SELECT MAX(range_start)
FROM account_range
WHERE range_start <= 25
) AND
range_end = (SELECT MIN(range_end)
FROM account_range
WHERE range_end >= 25
)
| is_active | range_start | range_end |
|-----------|-------------|-----------|
| 1 | 10 | 30 |
このクエリ(最初のクエリ)を高速化するために、2つのビットマップインデックスを「ビットマップと」操作と一緒に使用できますが、MySqlにはそのような機能はありません。
別のオプションは空間インデックスです(たとえば、PostgreSqlのGINインデックス: http://www.postgresql。 org / docs / current / static / textsearch-indexes.html
)。
そして別のオプションはスター変換(またはスタースキーマ)です-このテーブルを2つの「ディメンション」または「メジャー」テーブルと1つの「ファクト」テーブルに「分割」する必要があります。 ..しかし、これは広すぎるトピックです。詳細を知りたい場合は、ここから始めることができます: https:/ /en.wikipedia.org/wiki/Star_schema