Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Por que o MySql não otimiza automaticamente a consulta BETWEEN?


Tal comparação não faz sentido, já que você está comparando maçãs com laranjas.

Essas duas consultas não são equivalentes, elas dão resultados diferentes,
portanto, o MySql as otimiza de uma maneira diferente e seus planos podem ser diferentes.

Veja este exemplo simples: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);

A primeira consulta fornece 2 linhas:
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 |

A segunda consulta fornece apenas 1 linha:
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 |

Para acelerar essa consulta (a primeira), dois índices de bitmap podem ser usados ​​em conjunto com a operação "bitmap e" - mas o MySql não possui esse recurso.

Outra opção é um índice espacial ( por exemplo, índices GIN no PostgreSql:http://www.postgresql. org/docs/current/static/textsearch-indexes.html ).

E outra opção é uma transformação em estrela (ou um esquema em estrela) - você precisa "dividir" esta tabela em duas tabelas de "dimensão" ou "medidas" e uma tabela "fato". .. mas este é um tópico muito amplo, se você quiser saber mais, pode começar aqui:https:/ /en.wikipedia.org/wiki/Star_schema