En sådan jämförelse är inte vettig, eftersom du jämför äpplen med apelsiner.
Dessa två frågor är inte likvärdiga, de ger olika resultat,
så MySql optimerar dem på ett annat sätt och deras planer kan skilja sig.
Se detta enkla exempel: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);
Första frågan ger 2 rader:
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 |
Den andra frågan ger endast 1 rad:
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 |
För att snabba upp denna fråga (den första), kan två bitmappsindex användas tillsammans med "bitmapp och" operation - men MySql har inte en sådan funktion.
Ett annat alternativ är ett rumsligt index ( till exempel GIN-index i PostgreSql:http://www.postgresql. org/docs/current/static/textsearch-indexes.html
).
Och ett annat alternativ är en stjärnomvandling (eller ett stjärnschema) - du måste "dela upp" den här tabellen i två "dimensions" eller "mått" tabeller och en "fakta" tabell. .. men detta är för brett ämne, om du vill veta mer kan du börja här:https:/ /en.wikipedia.org/wiki/Star_schema