Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Dlaczego MySql nie optymalizuje automatycznie zapytania BETWEEN?

Takie porównanie nie ma sensu, skoro porównujesz jabłka do pomarańczy.

Te dwa zapytania nie są równoważne, dają różne wyniki,
więc MySql optymalizuje je w inny sposób i ich plany mogą się różnić.

Zobacz ten prosty przykład: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);

Pierwsze zapytanie daje 2 wiersze:

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 |

Drugie zapytanie daje tylko 1 wiersz:

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 |

Aby przyspieszyć to zapytanie (pierwsze), można użyć dwóch indeksów bitmapowych razem z operacją "bitmapa i" - ale MySql nie ma takiej funkcji.

Inną opcją jest indeks przestrzenny ( na przykład indeksy GIN w PostgreSql:http://www.postgresql. org/docs/current/static/textsearch-indexes.html ).

I kolejna opcja to transformacja gwiazdy (lub schemat gwiazdy) - trzeba "podzielić" tę tabelę na dwie tabele "wymiarów" lub "miar" i jedną tabelę "faktów".. .. ale to zbyt obszerny temat, jeśli chcesz wiedzieć więcej, możesz zacząć stąd:https:/ /pl.wikipedia.org/wiki/Star_schema



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. aplikacja łączy się z bazą danych

  2. Czy w MySQL można używać zapytania krzyżowego/przestawnego?

  3. Dane hierarchiczne w MySQL

  4. Jak połączyć się z mysql za pomocą laravel?

  5. Czy istnieje optymalna metoda zamawiania indeksu złożonego MySQL?