sql >> Databasteknik >  >> RDS >> Mysql

Varför optimerar inte MySql automatiskt MELLAN-frågan?

En sådan jämförelse är inte vettig, eftersom du jämför äpplen med apelsiner.

Dessa två frågor är inte likvärdiga, de ger olika resultat,
så MySql optimerar dem på ett annat sätt och deras planer kan skilja sig.

Se detta enkla exempel: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);

Första frågan ger 2 rader:

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 |

Den andra frågan ger endast 1 rad:

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 |

För att snabba upp denna fråga (den första), kan två bitmappsindex användas tillsammans med "bitmapp och" operation - men MySql har inte en sådan funktion.

Ett annat alternativ är ett rumsligt index ( till exempel GIN-index i PostgreSql:http://www.postgresql. org/docs/current/static/textsearch-indexes.html ).

Och ett annat alternativ är en stjärnomvandling (eller ett stjärnschema) - du måste "dela upp" den här tabellen i två "dimensions" eller "mått" tabeller och en "fakta" tabell. .. men detta är för brett ämne, om du vill veta mer kan du börja här:https:/ /en.wikipedia.org/wiki/Star_schema



  1. Autoinkrementera manuellt en kolumn MySQL

  2. RAWTONHEX() Funktion i Oracle

  3. MYSQL DATUMSOMRÅDE och TIDSOMRÅDE

  4. php och mysql kopiera post från en tabell till en annan