sql >> Base de Datos >  >> RDS >> Mysql

¿Por qué MySql no optimiza automáticamente ENTRE consultas?

Tal comparación no tiene sentido, ya que está comparando manzanas con naranjas.

Estas dos consultas no son equivalentes, dan resultados diferentes,
por lo que MySql las optimiza de una manera diferente y sus planes pueden diferir.

Vea este ejemplo simple: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 primera consulta da 2 filas:

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 segunda consulta da solo 1 fila:

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 esta consulta (la primera), se pueden usar dos índices de mapa de bits junto con la operación "mapa de bits y", pero MySql no tiene esa característica.

Otra opción es un índice espacial ( por ejemplo, índices GIN en PostgreSql:http://www.postgresql. org/docs/current/static/textsearch-indexes.html ).

Y otra opción es una transformación en estrella (o un esquema en estrella):debe "dividir" esta tabla en dos tablas de "dimensiones" o "medidas" y una tabla de "hechos". .. pero este es un tema demasiado amplio, si quieres saber más puedes empezar desde aquí:https:/ /en.wikipedia.org/wiki/Star_schema