Takie porównanie nie ma sensu, skoro porównujesz jabłka do pomarańczy.
Te dwa zapytania nie są równoważne, dają różne wyniki,
więc MySql optymalizuje je w inny sposób i ich plany mogą się różnić.
Zobacz ten prosty przykład: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);
Pierwsze zapytanie daje 2 wiersze:
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 |
Drugie zapytanie daje tylko 1 wiersz:
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 |
Aby przyspieszyć to zapytanie (pierwsze), można użyć dwóch indeksów bitmapowych razem z operacją "bitmapa i" - ale MySql nie ma takiej funkcji.
Inną opcją jest indeks przestrzenny ( na przykład indeksy GIN w PostgreSql:http://www.postgresql. org/docs/current/static/textsearch-indexes.html
).
I kolejna opcja to transformacja gwiazdy (lub schemat gwiazdy) - trzeba "podzielić" tę tabelę na dwie tabele "wymiarów" lub "miar" i jedną tabelę "faktów".. .. ale to zbyt obszerny temat, jeśli chcesz wiedzieć więcej, możesz zacząć stąd:https:/ /pl.wikipedia.org/wiki/Star_schema