Un simile confronto non ha senso, dal momento che stai confrontando mele con arance.
Queste due query non sono equivalenti, danno risultati diversi,
quindi MySql le ottimizza in modo diverso e i loro piani possono differire.
Guarda questo semplice esempio: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);
La prima query fornisce 2 righe:
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 |
La seconda query fornisce solo 1 riga:
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 |
Per velocizzare questa query (la prima), è possibile utilizzare due indici bitmap insieme all'operazione "bitmap e", ma MySql non dispone di tale funzionalità.
Un'altra opzione è un indice spaziale ( ad esempio indici GIN in PostgreSql:http://www.postgresql. org/docs/current/static/textsearch-indexes.html
).
E un'altra opzione è una trasformazione a stella (o uno schema a stella):è necessario "dividere" questa tabella in due tabelle "dimensioni" o "misure" e una tabella "fatti" .. .. ma questo è un argomento troppo ampio, se vuoi saperne di più puoi iniziare da qui:https:/ /en.wikipedia.org/wiki/Schema_stella