Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Warum optimiert MySql nicht automatisch BETWEEN-Abfragen?

Ein solcher Vergleich macht keinen Sinn, da Sie Äpfel mit Birnen vergleichen.

Diese beiden Abfragen sind nicht gleichwertig, sie liefern unterschiedliche Ergebnisse,
daher optimiert MySql sie auf unterschiedliche Weise und ihre Pläne können unterschiedlich sein.

Siehe dieses einfache Beispiel: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);

Die erste Abfrage ergibt 2 Zeilen:

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 |

Zweite Abfrage gibt nur 1 Zeile:

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 |

Um diese Abfrage (die erste) zu beschleunigen, können zwei Bitmap-Indizes zusammen mit der Operation "bitmap and" verwendet werden - aber MySql hat keine solche Funktion.

Eine weitere Option ist ein räumlicher Index ( zum Beispiel GIN-Indizes in PostgreSql:http://www.postgresql. org/docs/current/static/textsearch-indexes.html ).

Und eine weitere Option ist eine Sterntransformation (oder ein Sternschema) – Sie müssen diese Tabelle in zwei „Dimensions“- oder „Maßnahmen“-Tabellen und eine „Fakten“-Tabelle „unterteilen“. .. aber das ist ein zu breites Thema, wenn Sie mehr wissen wollen, können Sie hier anfangen:https:/ /en.wikipedia.org/wiki/Star_schema