Mysql
 sql >> Base de données >  >> RDS >> Mysql

Pourquoi MySql n'optimise-t-il pas automatiquement la requête BETWEEN ?

Une telle comparaison n'a pas de sens, puisque vous comparez des pommes à des oranges.

Ces deux requêtes ne sont pas équivalentes, elles donnent des résultats différents,
donc MySql les optimise de manière différente et leurs plans peuvent différer.

Voir cet exemple 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 première requête donne 2 lignes :

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 deuxième requête ne donne qu'une seule ligne :

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 |

Pour accélérer cette requête (la première), deux index bitmap peuvent être utilisés avec l'opération "bitmap and" - mais MySql n'a pas une telle fonctionnalité.

Une autre option est un index spatial ( par exemple les index GIN dans PostgreSql :http://www.postgresql. org/docs/current/static/textsearch-indexes.html ).

Et une autre option est une transformation en étoile (ou un schéma en étoile) - vous devez "diviser" ce tableau en deux tableaux "dimension" ou "mesures" et un tableau "fait". .. mais c'est un sujet trop vaste, si vous voulez en savoir plus, vous pouvez commencer par ici :https:/ /en.wikipedia.org/wiki/Star_schema