sql >> Databáze >  >> RDS >> Mysql

Proč MySql automaticky neoptimalizuje dotaz BETWEEN?

Takové srovnání nedává smysl, protože srovnáváte jablka s pomeranči.

Tyto dva dotazy nejsou rovnocenné, dávají různé výsledky,
proto je MySql optimalizuje jiným způsobem a jejich plány se mohou lišit.

Viz tento jednoduchý příklad: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);

První dotaz dává 2 řádky:

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 |

Druhý dotaz dává pouze 1 řádek:

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 |

Pro urychlení tohoto dotazu (první) lze použít dva bitmapové indexy společně s operací "bitmapa a" - ale MySql takovou funkci nemá.

Další možností je prostorový index ( například indexy GIN v PostgreSql:http://www.postgresql. org/docs/current/static/textsearch-indexes.html ).

A další možností je hvězdicová transformace (nebo hvězdné schéma) - tuto tabulku musíte "rozdělit" na dvě tabulky "dimenze" nebo "míry" a jednu tabulku "skutečnost". .. ale toto je příliš široké téma, pokud chcete vědět více, můžete začít zde:https:/ /cs.wikipedia.org/wiki/Star_schema



  1. Seskupit MySQL podle a přeskočit seskupování na nulové hodnoty

  2. Percentil hodnocení SQL

  3. Vytvořte schéma PostgreSQL

  4. PostgreSQL drop omezení s neznámým názvem