Mysql
 sql >> Database >  >> RDS >> Mysql

Perché MySql non ottimizza automaticamente la query BETWEEN?

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